First of all, Java actually has great enums that can be used polymorphically. I'm no Java programmer so someone else can certainly give a good example (I can't). Also, consider that polymorphism is often just overkill. I've also just seen the talk, and it's great, but it only provides guidelines, no silver bullet.
It's especially not true that all switch
statements can be replaced. State machines is actually one case where enums make a lot of sense. I use state machines a lot in parsing. Sure, this can be done with a design pattern and class polymorphism. But it's much (much) more code, it performs the same job, only slower, it's not a jot more readable and it's a solution that's only needed in one single place, without any code recycling. Using subclassing here simply has no advantage.
Then again, this is an exception. In general, subclassing is often the better solution in languages that support it well.
EDIT: I notice that this might raise controversy. Of course there are a lot of good solutions that encapsulate parsing, from regular expressions to parser generator frameworks such as Antlr. Nothing wrong with them and in all but the trivial cases these are the better solution. However, I work a lot with low-level code (not in Java, obviously), where regular expressions aren't supported and parser generators also incur an overhead.