diff --git a/core/lib/Drupal/Core/Language/Language.php b/core/lib/Drupal/Core/Language/Language.php
index 4f1605d..cf2248b 100644
--- a/core/lib/Drupal/Core/Language/Language.php
+++ b/core/lib/Drupal/Core/Language/Language.php
@@ -7,6 +7,8 @@
 
 namespace Drupal\Core\Language;
 
+use Drupal\Component\Utility\SortArray;
+
 /**
  * An object containing the information for an interface language.
  *
@@ -217,7 +219,9 @@ public function setNegotiationMethodId($method_id) {
    *   The array of language objects keyed by langcode.
    */
   public static function sort(&$languages) {
-    uasort($languages, 'Drupal\Component\Utility\SortArray::sortByWeightAndTitleKey');
+    uasort($languages, function ($a, $b) {
+      return SortArray::sortByWeightAndTitleKey($a, $b, 'weight', 'name');
+    });
   }
 
 }
diff --git a/core/tests/Drupal/Tests/Core/Language/LanguageUnitTest.php b/core/tests/Drupal/Tests/Core/Language/LanguageUnitTest.php
index 7abed94..ac01b78 100644
--- a/core/tests/Drupal/Tests/Core/Language/LanguageUnitTest.php
+++ b/core/tests/Drupal/Tests/Core/Language/LanguageUnitTest.php
@@ -91,4 +91,203 @@ public function testGetNegotiationMethodId() {
     $this->assertSame($method_id, $this->language->getNegotiationMethodId());
   }
 
+  /**
+   * Tests sorting an array of Language objects, using direct and not data provider.
+   *
+   * Arrays in the correct order.
+   */
+  public function testDirectSortArrayOfLanguagesCorrect() {
+    $language10A = new Language();
+    $language10A->setName('A');
+    $language10A->setWeight(10);
+    $language10A->setId('ee');
+    $language10B = new Language();
+    $language10B->setName('B');
+    $language10B->setWeight(10);
+    $language10B->setId('ff');
+
+    $languages = array();
+    $languages[$language10A->getId()] = $language10A;
+    $languages[$language10B->getId()] = $language10B;
+
+    $expected = array();
+    $expected[$language10A->getId()] = $language10A;
+    $expected[$language10B->getId()] = $language10B;
+
+    Language::sort($languages);
+
+    $this->assertEquals($expected, $languages);
+    reset($languages);
+    reset($expected);
+    $this->assertEquals(key($expected), key($languages));
+    next($languages);
+    next($expected);
+    $this->assertEquals(key($expected), key($languages));
+  }
+
+  /**
+   * Tests sorting an array of Language objects, using direct and not data provider.
+   *
+   * Array in the wrong order.
+   */
+  public function testDirectSortArrayOfLanguagesWrong() {
+    $language10A = new Language();
+    $language10A->setName('A');
+    $language10A->setWeight(10);
+    $language10A->setId('ee');
+    $language10B = new Language();
+    $language10B->setName('B');
+    $language10B->setWeight(10);
+    $language10B->setId('ff');
+
+    $languages = array();
+    $languages[$language10B->getId()] = $language10B;
+    $languages[$language10A->getId()] = $language10A;
+
+    $expected = array();
+    $expected[$language10A->getId()] = $language10A;
+    $expected[$language10B->getId()] = $language10B;
+
+    Language::sort($languages);
+
+    $this->assertEquals($expected, $languages);
+    reset($languages);
+    reset($expected);
+    $this->assertEquals(key($expected), key($languages));
+    next($languages);
+    next($expected);
+    $this->assertEquals(key($expected), key($languages));
+  }
+
+  /**
+   * Tests sorting an array of Language objects.
+   *
+   * A simpler test to just see how providers work.
+   *
+   * @dataProvider providerTestSimpleSortArrayOfLanguages
+   *
+   * @param array $languages
+   *   An array of \Drupal\Core\Language\Language objects.
+   * @param array $expected
+   *   The expected sorted array of languages.
+   */
+  public function testSimpleSortArrayOfLanguages(array $languages, array $expected) {
+    Language::sort($languages);
+    $this->assertEquals($languages['dd']->getName(), 'A');
+  }
+
+  /**
+   * Provides simple data for testSimpleSortArrayOfLanguages.
+   *
+   * @return array
+   *   An array of test data.
+   */
+  public function providerTestSimpleSortArrayOfLanguages() {
+    $language9A = new Language();
+    $language9A->setName('A');
+    $language9A->setWeight(9);
+    $language9A->setId('dd');
+
+    return array(
+      // Set up data, already ordered by weight.
+      array(
+        // $languages, an array of languages.
+        array(
+          [$language9A->getId()] => $language9A,
+        ),
+        // $expected, an array of languages.
+        array(
+          [$language9A->getId()] => $language9A,
+        ),
+      ),
+    );
+  }
+
+  /**
+   * Tests sorting an array of Language objects.
+   *
+   * @dataProvider providerTestSortArrayOfLanguages
+   *
+   * @param array $languages
+   *   An array of \Drupal\Core\Language\Language objects.
+   * @param array $expected
+   *   The expected sorted array of languages.
+   */
+  public function testSortArrayOfLanguages(array $languages, array $expected) {
+    Language::sort($languages);
+    $this->assertEquals($expected, $languages);
+    reset($expected);
+    reset($languages);
+    $this->assertEquals(key($expected), key($languages));
+    $this->assertEquals($languages['dd']->getName(), 'A');
+  }
+
+  /**
+   * Provides data for testSortArrayOfLanguages.
+   *
+   * @return array
+   *   An array of test data.
+   */
+  public function providerTestSortArrayOfLanguages() {
+    $language9A = new Language();
+    $language9A->setName('A');
+    $language9A->setWeight(9);
+    $language9A->setId('dd');
+    $language10A = new Language();
+    $language10A->setName('A');
+    $language10A->setWeight(10);
+    $language10A->setId('ee');
+    $language10B = new Language();
+    $language10B->setName('B');
+    $language10B->setWeight(10);
+    $language10B->setId('ff');
+
+    return array(
+      // Set up data, already ordered by weight.
+      array(
+        array(
+          [$language9A->getId()] => $language9A,
+          [$language10B->getId()] => $language10B,
+        ),
+        array(
+          [$language9A->getId()] => $language9A,
+          [$language10B->getId()] => $language10B,
+        ),
+      ),
+      // Set up data, out of order by weight.
+      array(
+        array(
+          [$language10B->getId()] => $language10B,
+          [$language9A->getId()] => $language9A,
+        ),
+        array(
+          [$language9A->getId()] => $language9A,
+          [$language10B->getId()] => $language10B,
+        ),
+      ),
+      // Set up data, tied by weight, already ordered by name.
+      array(
+        array(
+          [$language10A->getId()] => $language10A,
+          [$language10B->getId()] => $language10B,
+        ),
+        array(
+          [$language10B->getId()] => $language10B,
+          [$language10A->getId()] => $language10A,
+        ),
+      ),
+      // Set up data, tied by weight, out of order by name.
+      array(
+        array(
+          [$language10B->getId()] => $language10B,
+          [$language10A->getId()] => $language10A,
+        ),
+        array(
+          [$language10A->getId()] => $language10A,
+          [$language10B->getId()] => $language10B,
+        ),
+      ),
+    );
+  }
+
 }
