The paper is valuable but does not show how to make ad-hoc polymorphism less ad hoc.
I'll review the terminology and then apply it
Terminology
For the definition of "ad-hoc" polymorphism, the reader is pointed to Strachey's Fundamental Concepts in Programming Languages of 1967. Strachey does not hyphenate "ad hoc" and defines it as follows:
There seem to be two main classes [of polymporhpism], which can be
called ad hoc polymorphism and parametric polymorphism ... In ad hoc polymorphism there is no single systematic way of determining the type of the
result from the type of the arguments. There may be several rules of limited extent which reduce the number of cases, but these are themselves ad hoc both in scope and content ... Parametric polymorphism is more regular and may be illustrated by an example ...
Wadler's "Ad hoc" is not defined in the "Making" paper, so I assume what Wadler means is a pretheoretic notion of "ad hoc". Merriam-Webster's definition of the adverb form "ad hoc" seems apt: "for the particular end or case at hand without consideration of wider application".
Applying the terminology
"ad-hoc" and "ad hoc" as given in the paper appear to be synonyms. So the claim that the paper shows how to make ad-hoc polymorphism less ad hoc is either trivially false or too vague to engage with. The paper might as well be promising to make cheese less cheesey. It's still a great paper!
Why it matters that ad-hoc polymorphism was not made less ad hoc
If we use the terminology in the paper, it's easy to trick ourselves into thinking we are talking about something when we talk about systematic ad-hoc polymorphism. But "systematic ad-hoc polymorphism" is an oxymoron, at least using the definition given.
This leaves open the following possibilities, even without engaging with object oriented programming:
- type classes are a distinct mechanism for polymorphism that is not parametric polymorphism
- OR type classes are "just" parametric polymorphism. This would explain (for example) why a similar effect to type classes can be achieved using implicit parameters ("Type Classes as Objects and Implicits”)