To ensure platform independence, mobile programs are distributed in forms that are isomorphic to the original source code. Such codes are easy to decompile, and hence they increase the risk of malicious reverse engineering attacks. Several methods have been proposed to alleviate this situation. The highest level of protection is achieved with cryptographic solutions, but, unfortunately, this requires dedicated hardware with integrated decryption and execution units. A more modest level of protection is achieved through obfuscation. An obfuscator is a tool which -- through the application of code transformations -- converts a program into an equivalent one that is more difficult to reverse engineer. The advantage of this method is that it runs on standard hardware and without any changes to virtual machines or available interpreters. In a previous paper [Collberg, Thomborson, Low; POPL'98] we have described the design of a tool that obfuscates the control flow of Java programs. In this paper we extend the design with transformations that obfuscate data structures and abstractions. In particular, we show how to obfuscate classes, arrays, procedural abstractions and built-in data types like strings, integers, and booleans.