Difference between site()->language() and site()->language()->code()?

I found out that site()->language()->code() gave an error if the language did not exist and site()->language() did not.

Fatal error: Call to a member function code() on a non-object in

Are there any other differences that I need to be aware of?

Can site()->language() give any other result than the language code or false? If there are no big differences, why does site()->language()->code() exist? Is it needed?

The first returns the language object, the second a string:

<?php echo gettype($site->language()) ?>
<?php echo gettype($site->language()->code()) ?>

See the docs;