Among Java's primitive types, casting between integral types is implicit if widening from a narrow to a wide type like byte to int. Casting in the opposite direction requires an explicit cast which can lose data. Similarly, floating-point types can be implicitly widened but not narrowed without an explicit cast. Char can be implicitly cast to other primitive types but boolean cannot be cast at all.