Way 3 may be the least intrusive from the JVM's perspective, but it does complicate migration. One disadvantage is that it requires changes to declaration sites _and_ usage sites, while way 2 only requires changes to the declaration site. This may be fine in the empty collection case, but what about cases where the static field is public? We can't control those usage sites.
Also, it is less transparent -- one more encoding for non-java languages to emulate / reflective code to recognize.
