What are the differences between the built-in, primitive types (like int) and the equivalent, non-primitive object-wrapper classes (like Integer)?
The elemental types (int, long etc.) are fundamental parts of the Java language - they're reserved words. They directly represent a quantity, a character, etc.
The java.lang classes (e.g. Void, Integer, Long etc.) serve two functions - first, they provide utility methods (generally static to those classes) for doing commonplace tasks like turning an integer into a String and vice versa.
Equally, if you wanted to define a method that returned either a String or an int, you would define the function as returning a java.lang.Object; and then in practice you'd return either a java.lang.String or a java.lang.Integer, as appropriate.