Analysis
There are several dimensions along which we can compare these implementations: flexibility, performance, external integration, and cross-platform compatibility.
Flexibility
If "flexibility" is defined as having control over when and where the abstraction can be extended to a type, then the "plain function" approach is the least flexible. You must define all of the dispatch in one static cond. If you want to extend the abstraction to another class, then you have to add another clause to the cond. The other approaches give you the flexibility to define the conversion of a type in whatever namespace you want. You would obviously have to use this flexibility for good and not for evil.
If "flexibility" is defined as having the most leeway with dispatch, then the "multimethod" approach is the most flexible. I have not talked about derivation hierarchies, but multimethods can use ad hoc inheritance hierarchies for dispatch. You will have many more opportunities...