In Java you have int, and base types. That't exactly what you said in your initial post, but I fail to see why what is ok with Java (we can use Integer instead of int) is not ok with C++ (we can use Integer instead of int and DerivedFromObject instead of NotDerivedFromObject). Only user-defined types are Objects in Java, I would say it's not enough to fit your first category (at least, real OO languages are probably better examples).