Actually, looking into it a bit more, the following logic seems to hold:
- instance methods are mixed in as instance methods when mixin is called
- static category methods are mixed in as instance methods when mixin is called
- if during execution, neither of the above are found, then as part of internal missing method logic, a second lookup is done for methods from the mixed in class and any found methods (static or instance including ones added through meta-programming) are mixed in as needed as instance methods (but static methods are also remembered as such) - no category processing is done at this stage - and the fact that they then work as static methods is almost by accident
This seems quite complex to me and trying to repair the edge cases is possible but could be a little complex.
I suspect we will try to simplify and rationalize the behavior here in a future version of Groovy.