hook_user is declared as follows:
function hook_user($op, &$edit, &$account, $category = NULL)
According to the documentation of hook_user, when $op is set to 'submit' and/or 'update' a user account is about to be modified. This implies that $account, the user object, can be changed within hook_user and these changes will be saved to the database (note that $account is passed as reference). However, this is not the case: Changes made to $account will not be saved to the database.
I have tried this with
$op == 'submit',
$op == 'update' and
$op == 'insert'. In every case Drupal failed to save the changes made to $account (I attempted to change $account->roles).
This behaviour makes it impossible for modules to modify user information when a user is updated or created.