diff --git a/core/includes/language.inc b/core/includes/language.inc
index 72eebef..5f7d823 100644
--- a/core/includes/language.inc
+++ b/core/includes/language.inc
@@ -198,50 +198,46 @@ function language_types_disable($types) {
 /**
  * Updates the language type configuration.
  *
- * @param array $customized_language_types
- *   The configuration object containing the user defined preferences for
- *   language type customizability.
+ * @param array $configurable_language_types
+ *   An array of configurable language types.
  */
-function language_types_set(array $customized_language_types) {
+function language_types_set(array $configurable_language_types) {
   // Ensure that we are getting the defined language negotiation information. An
   // invocation of module_enable() or module_disable() could outdate the cached
   // information.
   drupal_static_reset('language_types_info');
   drupal_static_reset('language_negotiation_info');
-  $customized = array();
 
+  $language_types = array();
   $negotiation_info = language_negotiation_info();
   $language_types_info = language_types_info();
+
   foreach ($language_types_info as $type => $info) {
-    $customized[$type] = in_array($type, $customized_language_types);
-    // Check if the language is unlocked. Only unlocked language types can have
-    // their customized setting changed using the UI.
+    $configurable = in_array($type, $configurable_language_types);
+
+    // Check whether the language type is unlocked. Only the status of unlocked
+    // language types can be toggled between configurable and non-configurable.
+    // The default language negotiation settings, if available, are stored in
+    // $info['fixed'].
     if (empty($info['locked'])) {
-      if ($customized[$type] && empty($info['fixed'])) {
-        // If its customized (table is shown) and it has no default settings we
-        // give it some sane defaults that come from the language negotiation
-        // interface.
+      // If we have a non-locked non-configurable language type without default
+      // language negotiation settings, we use the values negotiated for the
+      // interface language which should always be available.
+      if (!$configurable && !empty($info['fixed'])) {
         $method_weights = array(LANGUAGE_NEGOTIATION_INTERFACE);
         $method_weights = array_flip($method_weights);
         language_negotiation_set($type, $method_weights);
       }
     }
     else {
-      // The language type is locked. Locked language types do not get a
-      // customize checkbox in the UI.
-
-      // Default language negotiation is stored in $info['fixed']. Locked
-      // language types with a default value do not get a table. Locked
-      // language types without a default value always get a table.
-      // If default settings is empty, then customized is true, and the table
-      // should be shown.
-      $customized[$type] = empty($info['fixed']);
-
-      if (!empty($info['fixed'])) {
-        // Language type is locked and has default settings and will never seen
-        // in the UI, for example URL language type.
-
-        // The language type has default settings, stored in $info['fixed'].
+      // Locked language types with default settings are always considered
+      // non-configurable. In turn if default settings are missing, the language
+      // type is always considered configurable.
+      $configurable = empty($info['fixed']);
+
+      // If the language is non-configurable we need to store its language
+      // negotiation settings.
+      if (!$configurable) {
         $method_weights = array();
         foreach ($info['fixed'] as $weight => $method_id) {
           if (isset($negotiation_info[$method_id])) {
@@ -251,11 +247,14 @@ function language_types_set(array $customized_language_types) {
         language_negotiation_set($type, $method_weights);
       }
     }
+
+    $language_types[$type] = $configurable;
   }
 
-  // Save enabled language types.
-  config('system.language.types')->set('configurable', array_keys(array_filter($customized)))->save();
-  config('system.language.types')->set('all', array_keys($language_types_info))->save();
+  // Store the language type configuration.
+  $config = config('system.language.types');
+  $config->set('configurable', array_keys(array_filter($language_types)))->save();
+  $config->set('all', array_keys($language_types))->save();
 
   // Ensure that subsequent calls of language_types_get_configurable() return
   // the updated language type information.
diff --git a/core/includes/update.inc b/core/includes/update.inc
index c11476b..cf25b03 100644
--- a/core/includes/update.inc
+++ b/core/includes/update.inc
@@ -448,15 +448,20 @@ function update_prepare_d8_bootstrap() {
  * Fixes stored include paths to match the "/core" migration.
  */
 function update_prepare_stored_includes() {
+  // Retrieve the currently stored language types. Default to the hardcoded D7
+  // values.
+  $default_language_types = array('language' => TRUE, 'language_content' => FALSE, 'language_url' => FALSE);
+  $language_types = array_keys(update_variable_get('language_types', $default_language_types));
+
   // Update language negotiation settings.
-  foreach (language_types_get_all() as $language_type) {
-    $negotiation = variable_get("language_negotiation_$language_type", array());
+  foreach ($language_types as $language_type) {
+    $negotiation = update_variable_get("language_negotiation_$language_type", array());
     foreach ($negotiation as &$method) {
       if (isset($method['file']) && $method['file'] == 'includes/locale.inc') {
         $method['file'] = 'core/modules/language/language.negotiation.inc';
       }
     }
-    variable_set("language_negotiation_$language_type", $negotiation);
+    update_variable_set("language_negotiation_$language_type", $negotiation);
   }
 }
 
diff --git a/core/modules/language/language.admin.inc b/core/modules/language/language.admin.inc
index c4b5d8d..aca6911 100644
--- a/core/modules/language/language.admin.inc
+++ b/core/modules/language/language.admin.inc
@@ -561,12 +561,12 @@ function theme_language_negotiation_configure_form($variables) {
 function language_negotiation_configure_form_submit($form, &$form_state) {
   $configurable_types = $form['#language_types'];
 
-  $customized_types = config('system.language.types')->get('configurable');
+  $stored_values = config('system.language.types')->get('configurable');
   $customized = array();
   $method_weights_type = array();
 
   foreach ($configurable_types as $type) {
-    $customized[$type] = in_array($type, $customized_types);
+    $customized[$type] = in_array($type, $stored_values);
     $method_weights = array();
     $enabled_methods = $form_state['values'][$type]['enabled'];
     $enabled_methods[LANGUAGE_NEGOTIATION_SELECTED] = TRUE;
