That instance seems fine to me.
It won't solve the general case of proxy arguments are those should typically be type variables rather than fixed Proxy type, so using an overloaded label would be ambiguous without a type signature:
example :: proxy a -> Int
So if you were designing an API intended to be used with an overloaded label it would probably make sense to pick a different type and just define the instance locally:
data StringProxy (str :: Symbol) = StringProxy; instance x ~ a => IsLabel x (StringProxy a) where fromLabel = StringProxy
since you were building an API intended to be used with overloaded labels. The user would find this less surprising as you'd be able to attach documentation to StringProxy explaining how it was intended to be used.
-Eric