We currently expose internal components as JMX MBeans, and that makes our JMX "API" very unstructured. The exposed MBeans should be separate components, and the only concern in their interfaces should be ease of use.
One example of JMX getting in the way of refactoring is CacheMgmtInterceptor. The interceptor chain is dynamic, so it should be possible to insert the interceptor only when statistics are enabled. But because the statisticsEnabled attribute is on the interceptor itself, that becomes a lot trickier, and we had to introduce a separate configuration attribute that disables statistics permanently (