I think that type classes are the way to go.
Duck typing is mostly popular because multiple inheritance sucks, and because inherting a class to only overload a method sucks.
Languages like Ruby, Python or Perl are so popular because they are less verbose than Java or C++, with the disadvantage, that the compiler can't help you that much.
Haskell is a language that combines the advantages, less verbosity with a helping compiler, and a static type system that rocks.