The true value comes from the fact that it only works, as explained in the article, when the type of the return value is known. This makes it very hard to make mistakes.
I use this form of value based polymorphism a lot in practice and wouldn't consider it fragile. Especially in combination with generic programming it allows you to write (or even derive) very concise conversion functions that are very safe in use.
Read is a great example of this working very well. It's, as you say, not really robust enough to work at the API or program level, but Show/Read provides a pretty quick, everywhere available serialization for many values. It's vital for debugging at the REPL.
Probably the most notorious example is the newbie-killer Regex library which uses polymorphic return types to dispatch what kind of result you want from your match, such as the match index or a list of group matches. It seems really clever since you just call the match function and affect whatever kind of pattern matching you want in order to pull values out, but it has always smelled to me since it's very hard to discover the functionality — the polymorphic return types aren't opaque, but are burdensome — and seems quite a bit too magical.
So I wouldn't personally go wild with return type polymorphism. It's obviously necessary in order to write things like filter, but unless the return type is simple and easily inferred by both compilers and people it can get hairy fast.
Conal Elliott has a good blog post about it. http://conal.net/blog/posts/everything-is-a-function-in-hask...
But really it's all confusion deriving from the fact that functions in Haskell mean something completely different from other languages.