Is subtype polymorphism a kind of ad hoc polymorphism?
They're definitely different things, which is easier to see with a clearer definition of ad-hoc polymorphism. Quoting from Wikipedia:


  ...ad hoc polymorphism is a kind of polymorphism in which polymorphic functions can be applied to arguments of different types...


So in the definition you've quoted, they're using "on" to mean "passed as arguments", rather than "called from". Ad-hoc polymorphism is available in Java in the form of method overloading. For example BigDecimal has 5 divide(...) methods, all taking different sets of parameters. Other languages have more obvious examples of ad-hoc polymorphism, where there's only one function/procedure, with a list of parameters, and the programmer has to decide what to do with them inside the function/procedure.

Subtype polymorphism, however, is when you can treat an instance of one type as an instance of another type, so anything available on the second type is also avaialable on the first. This is the toString() example you give. toString() doesn't operate on different arguments, but it can be called from different types (because it's defined on Object which everything in Java is a subtype of).