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.