diff --git a/core/includes/update.inc b/core/includes/update.inc
index 945ffe7..ac58210 100644
--- a/core/includes/update.inc
+++ b/core/includes/update.inc
@@ -843,7 +843,7 @@ function update_language_list($flags = LanguageInterface::STATE_CONFIGURABLE) {
       // No language module, so use the default language only.
       $languages = array($default->id => $default);
       // Add the special languages, they will be filtered later if needed.
-      $languages += \Drupal::languageManager()->getDefaultLockedLanguages($default->weight);
+      $languages += \Drupal::languageManager()->getDefaultLockedLanguages($default->getWeight());
     }
   }
 
diff --git a/core/lib/Drupal/Core/Language/Language.php b/core/lib/Drupal/Core/Language/Language.php
index 4f1605d..9bbc3ad 100644
--- a/core/lib/Drupal/Core/Language/Language.php
+++ b/core/lib/Drupal/Core/Language/Language.php
@@ -58,7 +58,7 @@ class Language implements LanguageInterface {
    *
    * @var int
    */
-  public $weight = 0;
+  protected $weight = 0;
 
   /**
    * Flag indicating if this is the only site default language.
@@ -166,7 +166,7 @@ public function setDirection($direction) {
    * {@inheritdoc}
    */
   public function getWeight() {
-    return $this->weight;
+    isset($language->weight) ? $language->weight : 0;
   }
 
   /**
@@ -216,8 +216,13 @@ public function setNegotiationMethodId($method_id) {
    * @param array $languages
    *   The array of language objects keyed by langcode.
    */
-  public static function sort(&$languages) {
-    uasort($languages, 'Drupal\Component\Utility\SortArray::sortByWeightAndTitleKey');
+  public static function sort(LanguageInterface $a, LanguageInterface $b) {
+    if ($a->getWeight() == $b->getWeight()) {
+      return strnatcasecmp($a->getName(), $b->getName());
+    }
+    else {
+      return $a->getWeight() < $b->getWeight() ? -1 : 1;
+    }
   }
 
 }
diff --git a/core/lib/Drupal/Core/Language/LanguageManager.php b/core/lib/Drupal/Core/Language/LanguageManager.php
index 0072f0c..db84c41 100644
--- a/core/lib/Drupal/Core/Language/LanguageManager.php
+++ b/core/lib/Drupal/Core/Language/LanguageManager.php
@@ -109,7 +109,7 @@ public function getLanguages($flags = LanguageInterface::STATE_CONFIGURABLE) {
       $default = $this->getDefaultLanguage();
       $this->languages = array($default->id => $default);
       // Add the special languages, they will be filtered later if needed.
-      $this->languages += $this->getDefaultLockedLanguages($default->weight);
+      $this->languages += $this->getDefaultLockedLanguages($default->getWeight());
     }
 
     // Filter the full list of languages based on the value of the $all flag. By
diff --git a/core/modules/language/language.module b/core/modules/language/language.module
index 5ac331b..3a084ca 100644
--- a/core/modules/language/language.module
+++ b/core/modules/language/language.module
@@ -425,7 +425,7 @@ function language_save($language) {
   $language_entity->label = isset($language->name) ? $language->name : '';
   $language_entity->direction = isset($language->direction) ? $language->direction : '0';
   $language_entity->locked = !empty($language->locked);
-  $language_entity->weight = isset($language->weight) ? $language->weight : 0;
+  $language_entity->weight = $language->getweight();
   $language_entity->setDefault(!empty($language->default));
   $language_entity->save();
   $t_args = array('%language' => $language->name, '%langcode' => $language->id);
diff --git a/core/modules/language/src/ConfigurableLanguageManager.php b/core/modules/language/src/ConfigurableLanguageManager.php
index cb96a8e..af66ac9 100644
--- a/core/modules/language/src/ConfigurableLanguageManager.php
+++ b/core/modules/language/src/ConfigurableLanguageManager.php
@@ -286,14 +286,14 @@ public function getLanguages($flags = BaseLanguageInterface::STATE_CONFIGURABLE)
         $data['default'] = ($langcode == $default->id);
         $data['name'] = $data['label'];
         $this->languages[$langcode] = new Language($data);
-        $weight = max(array($weight, $this->languages[$langcode]->weight));
+        $weight = max(array($weight, $this->languages[$langcode]->getWeight()));
       }
 
       // Add locked languages, they will be filtered later if needed.
       $this->languages += $this->getDefaultLockedLanguages($weight);
 
       // Sort the language list by weight then title.
-      Language::sort($this->languages);
+      uasort($this->languages, '\Drupal\Core\Language\Language::sort');
     }
 
     return parent::getLanguages($flags);
@@ -307,8 +307,8 @@ public function updateLockedLanguageWeights() {
 
     // Get maximum weight to update the system languages to keep them on bottom.
     foreach ($this->getLanguages(BaseLanguageInterface::STATE_CONFIGURABLE) as $language) {
-      if (!$language->locked && $language->weight > $max_weight) {
-        $max_weight = $language->weight;
+      if (!$language->locked && $language->getWeight() > $max_weight) {
+        $max_weight = $language->getWeight();
       }
     }
 
diff --git a/core/modules/language/src/Tests/LanguageConfigurationTest.php b/core/modules/language/src/Tests/LanguageConfigurationTest.php
index 6612cba..e9dd4bd 100644
--- a/core/modules/language/src/Tests/LanguageConfigurationTest.php
+++ b/core/modules/language/src/Tests/LanguageConfigurationTest.php
@@ -155,7 +155,7 @@ protected function checkConfigurableLanguageWeight($state = 'by default') {
     $replacements = array('@event' => $state);
     foreach (\Drupal::languageManager()->getLanguages(LanguageInterface::STATE_LOCKED) as $locked_language) {
       $replacements['%language'] = $locked_language->name;
-      $this->assertTrue($locked_language->weight > $max_configurable_language_weight, format_string('System language %language has higher weight than configurable languages @event', $replacements));
+      $this->assertTrue($locked_language->getWeight() > $max_configurable_language_weight, format_string('System language %language has higher weight than configurable languages @event', $replacements));
     }
   }
 
diff --git a/core/modules/system/src/Tests/Entity/EntityLanguageTestBase.php b/core/modules/system/src/Tests/Entity/EntityLanguageTestBase.php
index 3be40c6..daa1445 100644
--- a/core/modules/system/src/Tests/Entity/EntityLanguageTestBase.php
+++ b/core/modules/system/src/Tests/Entity/EntityLanguageTestBase.php
@@ -100,7 +100,7 @@ function setUp() {
 
     // Create the default languages.
     $default_language = language_save($this->languageManager->getDefaultLanguage());
-    $languages = $this->languageManager->getDefaultLockedLanguages($default_language->weight);
+    $languages = $this->languageManager->getDefaultLockedLanguages($default_language->getWeight());
     foreach ($languages as $language) {
       language_save($language);
     }
