The LSP: > Let φ(x) be a property provable about objects x of type T. Then φ(y) > should be true for objects y of type S where S is a subtype of T. What is provable about `Animal`? you don't provide code or return type, Presumably something like: (Animal.Hungry = false AND Food.State = Consumed) OR InvalidArgumentException thrown Is it still true for `Cat`? Yes. (assuming you add the state changes) Now what about `Food` and `Meat`? You don't prove any code, so we can assume the only difference is the Type. No violation is possible. What about that type checking statement in `Cat` though? this looks bad, its not a LSP violation, but it does raise questions about whether Food has a violation in it. If it doesn't then I shouldn't need to check the Type right? Really the code smell is pointing out that `Food` should have some sort of `FoodType` property or `CanBeEatenBy(Animal animal)` method, rather than using SubTypes to identify the type. The correct design would seem to fall outside the scope of your question though.