I keep forgetting the "Arduino Language" is not C++.
Changing the behavior print(uint8_t) and not print(int8_t) seems strange but then much of the "Arduino Language" seems strange to me.
The standard for C++ says I/O operators treat char, signed char, and, unsigned char in the same way.
So these all put a single byte in the output stream.
ostream& operator<< (ostream& out, char c );
ostream& operator<< (ostream& out, signed char c );
ostream& operator<< (ostream& out, unsigned char c );
The same holds for other character definitions. For example:
A character sequence is an array object (8.3.4) A that can be declared as T A[N ], where T is any of the types char, unsigned char, or signed char (3.9.1), optionally qualified by any combination of const or volatile.