There are languages (libraries) that solve it. For reference, check Clojure's multimethods and OCaml's polymorphic variants.
For example, if I'm writing a normal Java class, I know where I go to find methods dealing specifically with instances Foo (namely Foo and its children and direct users); with multimethods, it's more likely that there is some multimethod out there in an unrelated class that looks for instances of Foo.
A very good summary of that paper is available here: http://lambda-the-ultimate.org/node/1518#comment-17566
Another alternative based on recursive modules: http://www.math.nagoya-u.ac.jp/~garrigue/papers/#privaterows