This paper introduces type classes as a new approach to ad-hoc polymorphism, extending the Hindley/Milner type system. Type classes allow overloading of arithmetic operators and generalize "eqtype variables" from Standard ML. The authors motivate the need for a solution to ad-hoc polymorphism, highlighting issues in arithmetic and equality operations in languages like Standard ML and Miranda. They present an informal introduction to type classes and formally define them using type inference rules. The paper includes examples of defining arithmetic operations and equality using type classes, demonstrating how these operations can be translated into equivalent programs without overloading. The translation method involves introducing method dictionaries and passing them at runtime, avoiding exponential growth in the number of translations. The paper also discusses the concept of subclasses and their relationship to object-oriented programming, bounded quantification, and abstract data types. The authors conclude by exploring the potential of type classes in Haskell and other languages, noting that further work is needed to fully understand their implications.This paper introduces type classes as a new approach to ad-hoc polymorphism, extending the Hindley/Milner type system. Type classes allow overloading of arithmetic operators and generalize "eqtype variables" from Standard ML. The authors motivate the need for a solution to ad-hoc polymorphism, highlighting issues in arithmetic and equality operations in languages like Standard ML and Miranda. They present an informal introduction to type classes and formally define them using type inference rules. The paper includes examples of defining arithmetic operations and equality using type classes, demonstrating how these operations can be translated into equivalent programs without overloading. The translation method involves introducing method dictionaries and passing them at runtime, avoiding exponential growth in the number of translations. The paper also discusses the concept of subclasses and their relationship to object-oriented programming, bounded quantification, and abstract data types. The authors conclude by exploring the potential of type classes in Haskell and other languages, noting that further work is needed to fully understand their implications.