About your [1] ... dynamic languages can support multimethods (i.e. method overloading on steroids) so I don't get how a dynamic language can't do overloading based on return type.
The difference between a static and a dynamic language would be when this dispatch is made (compile-time versus runtime).