Wasn't quite clear. I'm assuming that there are three constructors for a singleton and that they are incompatible - otherwise why not have one method?
If I'm wrong about them being incompatible, then have only a single method and move the variance to another method.
I suggested exception because if one has already been created, and you ask for a now incompatible one, it should be an error. Calling the successful getSingleton again should succeed.
I'm assuming the getSingleton method(s) are synchronized on the same object (the Class in this case).
The advantage over the old way is that there isn't a race condition.
Actually, I'm not sure why only one interpreter is allowed. An alternative would be to have separate createInterpreter, getDefaultInterpreter or better, just use new to get a private interpreter instead of having a createInterpreter.
createInterpreter/new always succeeds and returns a non-global interpreter you need to keep track of yourself. getDefaultInterpreter either returns the static interpreter or creates, stores, and returns it.
Having a createXXX that returns nil and sometimes returns an interpreter makes no sense to me.
If we land up refactoring, I'd also propose we move the j stuff to a separate class.