"Sort of." Java 8 added unsigned integer arithmetic methods to Integer. Examples: compareUnsigned, divideUnsigned, parseUnsignedInt, remainderUnsigned, toUnsignedLong, etc. You still use long and int, and they still have the capability to store signed values. However, if you want, you only use them for unsigned values and with the Unsigned methods.
I don't think it's a "glaring omission." Life is quite difficult without signed integers -- you've really got to have those. Signed integers (of sufficient width) can functionally do everything unsigned integers can do. (What *functionality* are you missing?) If you have both signed and unsigned integers then you've got to have facilities for typecasting, and that has proven to be at least complicated enough. I think the reason unsigned integer data types were created in other languages has much more to do with the "every bit is precious" constraints in the formative years of those languages and their ancestors. They didn't want to "spend" a precious bit on a sign for every integer, hence the unsigned integer data type. Well, the 1990s (and even 1980s) came calling, with 32-bit and 64-bit addressable memory, and we don't have to be quite so bit thrifty. Every integer can have its sign, even if we never need it.
Signed strings and characters in Java were probably a mistake, though.