I'm not sure what you are looking for with the "Reference Size" points, but here are the few I can answer with some certainty:
if primitive type differs, then resulting type is always at least widest of two types.
isn't quite true. If you specify int and pass in a long, you have to downcast to int and what will be passed is an int. If you pass a byte, it will automatically be up-casted to an int. It will always pass an int.
Object size is sum of all primitive and reference type sizes that it contains
There is also a function pointer table and some other stuff, I don't think it's this straight-forward.
Static variables are not contained in object
I would say they are not contained in the object Instance, but there may be a pointer to them in the object instance (in that pointer table I was talking about)... but I don't think so.
'null' (empty reference?)
If you pass null it will act much like c (I believe a pointer to 0 or some other predefined bad location that means "Null") but you don't have any access to this except to compare it to null or get an NPE, you can't deal with it in other ways like you can in c
object type differs (first common parent?)(how is that found???)
There is meta-data stored in an object to tell you what type it is, but more importantly there is a pointer table so that the "Correct" method to call is always just a de-reference of a pointer, you don't have to figure out what class you actually have and scan up the "Extends" tree to find the first implementation of a given method, instead regardless of what your class is casted to there is a pointer to the correct "toString" method that you should be using.
anonymous class
These are given magic names based on the parent's class name and compiled as regular classes with some special exceptions.