Ah yeah, actually, my first explanation for why the Optional case works is a bit confused, since the logic that Thing is a subtype of Optional<Thing> would actually make the (Thing) -> Void function a better choice than the (Optional<Thing>) -> Void function. In fact, you are correct—we explicitly disallow subtype relationships that require value-to-optional conversions from being used to decide that a given overload is better than another.
I'm actually somewhat ambivalent about which 'should' work, I can see the case in both directions. But it's certainly not obvious to me that these two cases should behave differently from one another and feels more like an emergent behavior of how exactly we've defined the subtyping rule for generic declarations.