Thank you for bringing this up, and you are right that time does change things. To be completely clear, I am speaking only for myself in this post, not the core team or anyone else.
A couple of years ago, I was completely against anything like this, feeling strongly that 'self' as a keyword was magical and privileged. Various things have changed that opinion, including the introduction of guard.
I now agree with you that this is important, and that we should do the obvious thing here: just make self be a normal identifier which is implicitly injected into methods. This is your #1 option, which would allow rebinding with if/let, guard, shadowing and everything else.
I am pretty strongly opposed to #2 (make the bug a feature) as the bug is an ugly gross workaround. We should just move forward and accept the obvious code that users will continue to write. I don't see any obvious downside of doing so.
-Chris