Bloch's Effective Java is the true must read here, 80% of this article simply re-iterates what was already published there (and in other places) already. The author just adds this "canEquals" idea, which sounds like it might become annoying and hard to maintain if you have more than a small handful of subclasses to deal with.
EDIT: by different kinds of equality, I mean such things as equalByContent for mutable fields or equalByLocation.