We study the type inference problem for a system with type classes as in the functional programminglanguage Haskell. Type classes are an extension of ML-style polymorphismwith overloading. We generalize Milner's work on polymorphism by introducing a separate context constraining the type variables in a typing judgement. This leads to simple type inference systems and algorithms which closely resemble those for ML. In particular we present a new uni cation algorithm which is an extension of syntactic uni cation with constraint solving. The existence of principal types follows from an analysis of this uni cation algorithm.