We have implemented a virtual machine (VM) for Java which executes on a cluster. Our cluster VM completely hides the cluster from the application, presenting a single system image (SSI) (i.e., the application sees a traditional virtual machine). At the same time it leverages the cluster to achieve improved performance for a range of applications. We show how the flexibility and constraints of the Java Virtual Machine (JVM) Specification [10] impacted the design of our cluster VM. We describe issues related to class loading and distribution-aware implementations of the bytecodes. We also the limits on providing a solution for completely transparent distribution of multi-threaded Java applications if one does not modify the VM or the core classes.