I've discovered why I'm not getting the monitor exits I expect. In ProcessAdapter.exit a test is made for the state of the process. If it's not alive, then the link break, monitor break code, is not triggered. However, it is possible for monitor to be registered during the call to exit. The subsequent call to exit then does not issue the rest of the monitor exit messages (and ditto for the link breaks). So, it seems process exit is not quite right. If I remove this check, then I get more monitor exit messages through to my erlang process.
Wall of text as it's late.