diff --git a/core/modules/language/language.module b/core/modules/language/language.module
index fc057c3ef50031676bad0aa9e2e29e811ccdb4d0..7629cbf38c2a6fcfc2a61094e865205e4ea4f021 100644
--- a/core/modules/language/language.module
+++ b/core/modules/language/language.module
@@ -7,12 +7,15 @@
 
 use Drupal\Core\Url;
 use Drupal\Core\Access\AccessResult;
+use Drupal\Core\Config\FileStorage;
+use Drupal\Core\Config\InstallStorage;
 use Drupal\Core\Entity\ContentEntityFormInterface;
 use Drupal\Core\Entity\EntityFormInterface;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Field\FieldDefinitionInterface;
 use Drupal\Core\Field\FieldItemListInterface;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Installer\InstallerKernel;
 use Drupal\Core\Language\LanguageInterface;
 use Drupal\Core\Routing\RouteMatchInterface;
 use Drupal\Core\Session\AccountInterface;
@@ -289,8 +292,26 @@ function language_negotiation_url_prefixes_update() {
 /**
  * Implements hook_modules_installed().
  */
-function language_modules_installed($modules) {
+function language_modules_installed($modules, $is_syncing) {
+  if ($is_syncing) {
+    return;
+  }
+
   if (!in_array('language', $modules)) {
+    if (InstallerKernel::installationAttempted()) {
+      // If the install profile provides its own language.types configuration do
+      // not overwrite it.
+      $profile_directory = \Drupal::service('extension.list.profile')->getPath(\Drupal::installProfile());
+      $profile_storages = [
+        new FileStorage($profile_directory . '/' . InstallStorage::CONFIG_INSTALL_DIRECTORY),
+        new FileStorage($profile_directory . '/' . InstallStorage::CONFIG_OPTIONAL_DIRECTORY),
+      ];
+      foreach ($profile_storages as $storage) {
+        if ($storage->exists('language.types')) {
+          return;
+        }
+      }
+    }
     // Since newly (un)installed modules may change the default settings for
     // non-locked language types (e.g. content language), we need to resave the
     // language type configuration.
@@ -318,8 +339,8 @@ function language_modules_installed($modules) {
 /**
  * Implements hook_modules_uninstalled().
  */
-function language_modules_uninstalled($modules) {
-  language_modules_installed($modules);
+function language_modules_uninstalled($modules, $is_syncing) {
+  language_modules_installed($modules, $is_syncing);
 }
 
 /**
diff --git a/core/modules/language/tests/src/Functional/LanguageConfigInstallOverrideExistingTest.php b/core/modules/language/tests/src/Functional/LanguageConfigInstallOverrideExistingTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..74a8bd9352c72352fdfe4237d0ea8daaf178eb60
--- /dev/null
+++ b/core/modules/language/tests/src/Functional/LanguageConfigInstallOverrideExistingTest.php
@@ -0,0 +1,42 @@
+<?php
+
+namespace Drupal\Tests\language\Functional;
+
+use Drupal\Tests\BrowserTestBase;
+
+/**
+ * Ensures the language config is installed but not altered on install.
+ *
+ * @group language
+ */
+class LanguageConfigInstallOverrideExistingTest extends BrowserTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $profile = 'test_language_negotiation';
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $defaultTheme = 'stark';
+
+  /**
+   * Tests when language config is installed existing config is not overridden.
+   */
+  public function testLanguageConfigInstallOverrideExisting() {
+    /** @var \Drupal\Core\Config\StorageInterface $storage */
+    $storage = $this->container->get('config.storage');
+    $config = $this->config('language.types');
+
+    // The negotiation methods that have been removed should be disabled after
+    // purging if not avoided in language_modules_installed().
+    $language_types_data = $storage->read('language.types');
+    $this->assertTrue(isset($language_types_data['negotiation']['language_content']['enabled']['test_language_negotiation_method']));
+    $this->assertTrue(isset($language_types_data['negotiation']['language_content']['enabled']['language-selected']));
+
+    $this->assertEquals(-10, $config->get('negotiation.language_content.enabled.test_language_negotiation_method'));
+    $this->assertEquals(12, $config->get('negotiation.language_content.enabled.language-selected'));
+  }
+
+}
diff --git a/core/profiles/test_language_negotiation/config/install/language.types.yml b/core/profiles/test_language_negotiation/config/install/language.types.yml
new file mode 100644
index 0000000000000000000000000000000000000000..9e411ba2c495538c5def06656685c3b1de3aa2d1
--- /dev/null
+++ b/core/profiles/test_language_negotiation/config/install/language.types.yml
@@ -0,0 +1,39 @@
+all:
+  - language_interface
+  - language_content
+  - language_url
+configurable:
+  - language_interface
+  - language_content
+negotiation:
+  language_content:
+    enabled:
+      test_language_negotiation_method: -10
+      language-url: -8
+      language-selected: 12
+    method_weights:
+      test_language_negotiation_method: -10
+      language-content-entity: -9
+      language-url: -8
+      language-session: -6
+      language-user: -4
+      language-browser: -2
+      language-interface: 9
+      language-selected: 12
+  language_url:
+    enabled:
+      language-url: 0
+      language-url-fallback: 1
+  language_interface:
+    enabled:
+      language-user-admin: -20
+      language-user: -19
+      language-url: -18
+      language-selected: -15
+    method_weights:
+      language-user-admin: -20
+      language-user: -19
+      language-url: -18
+      language-session: -17
+      language-browser: -16
+      language-selected: -15
diff --git a/core/profiles/test_language_negotiation/test_language_negotiation.info.yml b/core/profiles/test_language_negotiation/test_language_negotiation.info.yml
new file mode 100644
index 0000000000000000000000000000000000000000..a83b1cfb4347828417d8e6fb5ca7730a102211a3
--- /dev/null
+++ b/core/profiles/test_language_negotiation/test_language_negotiation.info.yml
@@ -0,0 +1,7 @@
+name: Testing language negotiation
+type: profile
+description: 'Minimal profile for running tests related the language negotiation.'
+version: VERSION
+hidden: true
+install:
+  - drupal:language