Correct me if I\'m wrong, but it seems like algebraic data types in Haskell are useful in many of the cases where you would use classes and inheritance in OO languages. But
Another (more or less) intuitive way of looking at data types and typeclasses versus object oriented classes is the following:
A class Foo in an OO language represents both a concrete type Foo as well as the class of all Foo-types: those which are directly or indirectly derived from Foo.
In OO languages, you just happen to implicitly program against the class of Foo-types which allows you to "extend" Foo.