The difference is that the Integer class is final, but Animal is not. That means that the compiler knows that variable "io" can only point to an Integer, not to any other subtype of Integer that implements Driveable. In comparison, "animal" can point to an instance of an class that extends the Animal class - it's possible that someone could create a class that extends Animal and implements Driveable. Even if no such class exists at the moment. The general rule is that if you're classing from a final class to an interface, and the final class does not implement the interface, that's illegal at compile time. But if the class is not final, it's legal at compile time, and then you get a run-time exception if the actual class at run-time does not implement the interface.
Look in the JLS =Java® Language Specification. It tells you that instanceof won't compile if the cast to the same type won't compile. Since Integer doesn't implement that interface, neither a cast nor instanceof would compile. The cast won't compile because the compiler can tell that it would never succeed.
Don't call an Integer io because people might confuse that with a moon round a giant planet or input/output. Try i as a name. Don't use the Integer(int) constuctor; use valueOf() or straight boxing instead.
The two armies met. But instead of battle, they decided to eat some pie and contemplate this tiny ad: