For your particular example, what about simply using functions taking the object as argument instead?
equals(Object a, Object b)
I think people tends to be pretty extremist in what they "think" is awesome or catastrophic.
Let's be objective. Inheritance is useful in many cases. It's not a "necessity" but is quite handy in some cases. However, yes, it tends to be overused/overpromoted and sometimes introduces complexity where it shouldn't.
Can we live without inheritance in mainstream programming languages? Not really. They are an essential and useful construct. Doing without them would be a pain in the ass.
Can we find some other mechanisms which are better than inheritance? Surely. Single inheritance is very limited, multiple inheritance is a two-sided blade. But inheritance itself might not be the best route altogether. One way are the traits like in Scala, the classes like in Haskell (nothing to do with normal classes), and many other mechanisms.
However, one might go even further and asks whether "objects" are the way to go in our modern world. Perhaps something with algebraic data types and asynchronous agents would fit better the challenges of massive parallelism and expressiveness in programming languages. (Yeah, I know, this sounds like academic mumbo-jumbo, but there is actually very concrete stuff behind it.)