I'm not entirely sure how the new Android Runtime works, but previously, almost all of the basic java classes (full list here: https://android.googlesource.com/platform/frameworks/base.git/+/master/preloaded-classes) are preloaded by the zygote process. New processes are forked from Zygote, and thus receive a copy of a system ClassLoader (http://developer.android.com/reference/java/lang/ClassLoader.html#getSystemClassLoader()) that already has these classes loaded. Therefore, it isn't possible to modify these classes on the fly.
However, DexMaker allows subclassing the base system classes by generating a new dex file at runtime. The dynamically generated subclass can then be used to in the same way the base class would.