diff --git a/core/includes/locale.inc b/core/includes/locale.inc
index ab11d31..8095e94 100644
--- a/core/includes/locale.inc
+++ b/core/includes/locale.inc
@@ -215,7 +215,7 @@ function locale_language_from_user($languages) {
   global $user;
 
   if ($user->uid) {
-    return $user->language;
+    return $user->langcode;
   }
 
   // No language preference from the user.
diff --git a/core/modules/locale/locale.test b/core/modules/locale/locale.test
index 42a0fbd..c34ea4b 100644
--- a/core/modules/locale/locale.test
+++ b/core/modules/locale/locale.test
@@ -1672,7 +1672,7 @@ class LocaleUserCreationTest extends DrupalWebTestCase {
     $this->drupalPost($langcode . '/admin/people/create', $edit, t('Create new account'));
 
     $user = user_load_by_name($username);
-    $this->assertEqual($user->language, $langcode, t('New user has correct language set.'));
+    $this->assertEqual($user->langcode, $langcode, t('New user has correct language set.'));
 
     // Register a new user and check if the language selector is hidden.
     $this->drupalLogout();
@@ -1689,7 +1689,7 @@ class LocaleUserCreationTest extends DrupalWebTestCase {
     $this->drupalPost($langcode . '/user/register', $edit, t('Create new account'));
 
     $user = user_load_by_name($username);
-    $this->assertEqual($user->language, $langcode, t('New user has correct language set.'));
+    $this->assertEqual($user->langcode, $langcode, t('New user has correct language set.'));
 
     // Test if the admin can use the language selector and if the
     // correct language is was saved.
diff --git a/core/modules/openid/openid.test b/core/modules/openid/openid.test
index 5c6ca69..d764ed9 100644
--- a/core/modules/openid/openid.test
+++ b/core/modules/openid/openid.test
@@ -421,7 +421,7 @@ class OpenIDRegistrationTestCase extends OpenIDWebTestCase {
     $this->assertTrue($user, t('User was registered with right username.'));
     $this->assertEqual($user->mail, 'john@example.com', t('User was registered with right email address.'));
     $this->assertEqual($user->timezone, 'Europe/London', t('User was registered with right timezone.'));
-    $this->assertEqual($user->language, 'en', t('User was registered with right language.'));
+    $this->assertEqual($user->langcode, 'en', t('User was registered with right language.'));
     $this->assertFalse($user->data, t('No additional user info was saved.'));
 
     $this->submitLoginForm($identity);
@@ -463,7 +463,7 @@ class OpenIDRegistrationTestCase extends OpenIDWebTestCase {
     $this->assertTrue($user, t('User was registered with right username.'));
     $this->assertEqual($user->mail, 'john@example.com', t('User was registered with right email address.'));
     $this->assertEqual($user->timezone, 'Europe/London', t('User was registered with right timezone.'));
-    $this->assertEqual($user->language, 'en', t('User was registered with right language.'));
+    $this->assertEqual($user->langcode, 'en', t('User was registered with right language.'));
     $this->assertFalse($user->data, t('No additional user info was saved.'));
 
     $this->drupalLogout();
@@ -508,7 +508,7 @@ class OpenIDRegistrationTestCase extends OpenIDWebTestCase {
 
     $user = user_load_by_name('john');
     $this->assertTrue($user, t('User was registered with right username.'));
-    $this->assertFalse($user->language, t('No user language was saved.'));
+    $this->assertFalse($user->langcode, t('No user language was saved.'));
     $this->assertFalse($user->data, t('No additional user info was saved.'));
 
     // Follow the one-time login that was sent in the welcome e-mail.
@@ -548,7 +548,7 @@ class OpenIDRegistrationTestCase extends OpenIDWebTestCase {
 
     $user = user_load_by_name('john');
     $this->assertTrue($user, t('User was registered with right username.'));
-    $this->assertFalse($user->language, t('No user language was saved.'));
+    $this->assertFalse($user->langcode, t('No user language was saved.'));
     $this->assertFalse($user->data, t('No additional user info was saved.'));
 
     // Follow the one-time login that was sent in the welcome e-mail.
@@ -593,7 +593,7 @@ class OpenIDRegistrationTestCase extends OpenIDWebTestCase {
     $this->assertTrue($user, t('User was registered with right username.'));
     $this->assertEqual($user->mail, 'john@example.com', t('User was registered with right email address.'));
     $this->assertEqual($user->timezone, 'Europe/London', t('User was registered with right timezone.'));
-    $this->assertEqual($user->language, 'en', t('User was registered with right language.'));
+    $this->assertEqual($user->langcode, 'en', t('User was registered with right language.'));
   }
 }
 
diff --git a/core/modules/simpletest/tests/common.test b/core/modules/simpletest/tests/common.test
index c4a7cbe..083c819 100644
--- a/core/modules/simpletest/tests/common.test
+++ b/core/modules/simpletest/tests/common.test
@@ -2383,7 +2383,7 @@ class CommonFormatDateTestCase extends DrupalWebTestCase {
     $real_user = $user;
     $user = user_load($test_user->uid, TRUE);
     $real_language = $language->langcode;
-    $language->langcode = $user->language;
+    $language->langcode = $user->langcode;
     // Simulate a Drupal bootstrap with the logged-in user.
     date_default_timezone_set(drupal_get_user_timezone());
 
diff --git a/core/modules/simpletest/tests/upgrade/drupal-7.language.database.php b/core/modules/simpletest/tests/upgrade/drupal-7.language.database.php
index 67d51e2..2d0a014 100644
--- a/core/modules/simpletest/tests/upgrade/drupal-7.language.database.php
+++ b/core/modules/simpletest/tests/upgrade/drupal-7.language.database.php
@@ -524,3 +524,40 @@ db_update('system')->fields(array(
 ->condition('type', 'module')
 ->condition('name', 'locale')
 ->execute();
+
+db_insert('users')->fields(array(
+  'uid',
+  'name',
+  'pass',
+  'mail',
+  'theme',
+  'signature',
+  'signature_format',
+  'created',
+  'access',
+  'login',
+  'status',
+  'timezone',
+  'language',
+  'picture',
+  'init',
+  'data',
+))
+->values(array(
+  'uid' => '12',
+  'name' => 'testuser',
+  'pass' => 'testpass',
+  'mail' => 'test@mydomain.com',
+  'signature' => '',
+  'signature_format' => '',
+  'created' => REQUEST_TIME,
+  'access' => 0,
+  'login' => 0,
+  'status' => 1,
+  'timezone' => '',
+  'language' => 'und',
+  'picture' => '',
+  'init' => 'test@mydomain.com',
+  'data' => '',
+))
+->execute();
diff --git a/core/modules/simpletest/tests/upgrade/upgrade.language.test b/core/modules/simpletest/tests/upgrade/upgrade.language.test
index ee77fa7..2ab0aa3 100644
--- a/core/modules/simpletest/tests/upgrade/upgrade.language.test
+++ b/core/modules/simpletest/tests/upgrade/upgrade.language.test
@@ -46,5 +46,9 @@ class LanguageUpgradePathTestCase extends UpgradePathTestCase {
     $this->assertFieldByName('language');
     $this->drupalGet('node/add/page');
     $this->assertNoFieldByName('language');
+
+    // Directly check the user language property.
+    $user = db_query('SELECT * FROM {users} WHERE uid = :uid', array(':uid' => 12))->fetchObject();
+    $this->assertTrue($user->langcode == 'und', t('User language code found.'));
   }
 }
diff --git a/core/modules/user/user.install b/core/modules/user/user.install
index f7175c3..8b6a49c 100644
--- a/core/modules/user/user.install
+++ b/core/modules/user/user.install
@@ -202,7 +202,7 @@ function user_schema() {
         'not null' => FALSE,
         'description' => "User's time zone.",
       ),
-      'language' => array(
+      'langcode' => array(
         'type' => 'varchar',
         'length' => 12,
         'not null' => TRUE,
@@ -351,6 +351,16 @@ function user_update_8000() {
     unset($settings['extra_fields']['display']['summary']);
     field_bundle_settings('user', 'user', $settings);
   }
+
+  $langcode_spec = array(
+    'type' => 'varchar',
+    'length' => 12,
+    'not null' => TRUE,
+    'default' => '',
+    'description' => "Language code, e.g. 'de' or 'en-US'.",
+  );
+  db_change_field('users', 'language', 'langcode', $langcode_spec);
+  db_add_index('users', 'users_uid_langcode', array('uid', 'langcode'));
 }
 
 /**
diff --git a/core/modules/user/user.module b/core/modules/user/user.module
index 928daad..a6ff19d 100644
--- a/core/modules/user/user.module
+++ b/core/modules/user/user.module
@@ -3460,8 +3460,8 @@ function theme_user_signature($variables) {
  */
 function user_preferred_language($account, $default = NULL) {
   $language_list = language_list();
-  if (!empty($account->language) && isset($language_list[$account->language])) {
-    return $language_list[$account->language];
+  if (!empty($account->langcode) && isset($language_list[$account->langcode])) {
+    return $language_list[$account->langcode];
   }
   else {
     return $default ? $default : language_default();
diff --git a/core/modules/user/user.test b/core/modules/user/user.test
index 367bf82..4b9ac20 100644
--- a/core/modules/user/user.test
+++ b/core/modules/user/user.test
@@ -166,7 +166,7 @@ class UserRegistrationTestCase extends DrupalWebTestCase {
     $this->assertTrue(($new_user->created > REQUEST_TIME - 20 ), t('Correct creation time.'));
     $this->assertEqual($new_user->status, variable_get('user_register', USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL) == USER_REGISTER_VISITORS ? 1 : 0, t('Correct status field.'));
     $this->assertEqual($new_user->timezone, variable_get('date_default_timezone'), t('Correct time zone field.'));
-    $this->assertEqual($new_user->language, '', t('Correct language field.'));
+    $this->assertEqual($new_user->langcode, '', t('Correct language field.'));
     $this->assertEqual($new_user->picture, '', t('Correct picture field.'));
     $this->assertEqual($new_user->init, $mail, t('Correct init field.'));
   }
diff --git a/core/modules/user/user.tokens.inc b/core/modules/user/user.tokens.inc
index 76ec4a2..833e763 100644
--- a/core/modules/user/user.tokens.inc
+++ b/core/modules/user/user.tokens.inc
@@ -65,10 +65,10 @@ function user_tokens($type, $tokens, array $data = array(), array $options = arr
   $url_options = array('absolute' => TRUE);
   if (isset($options['language'])) {
     $url_options['language'] = $options['language'];
-    $language_code = $options['language']->langcode;
+    $langcode = $options['language']->langcode;
   }
   else {
-    $language_code = NULL;
+    $langcode = NULL;
   }
   $sanitize = !empty($options['sanitize']);
 
@@ -103,12 +103,12 @@ function user_tokens($type, $tokens, array $data = array(), array $options = arr
 
         // These tokens are default variations on the chained tokens handled below.
         case 'last-login':
-          $replacements[$original] = !empty($account->login) ? format_date($account->login, 'medium', '', NULL, $language_code) : t('never');
+          $replacements[$original] = !empty($account->login) ? format_date($account->login, 'medium', '', NULL, $langcode) : t('never');
           break;
 
         case 'created':
           // In the case of user_presave the created date may not yet be set.
-          $replacements[$original] = !empty($account->created) ? format_date($account->created, 'medium', '', NULL, $language_code) : t('not yet created');
+          $replacements[$original] = !empty($account->created) ? format_date($account->created, 'medium', '', NULL, $langcode) : t('not yet created');
           break;
       }
     }
