diff --git a/core/lib/Drupal/Component/Version/Constraint.php b/core/lib/Drupal/Component/Version/Constraint.php
index cbf72704e0..2cde858616 100644
--- a/core/lib/Drupal/Component/Version/Constraint.php
+++ b/core/lib/Drupal/Component/Version/Constraint.php
@@ -108,8 +108,10 @@ private function parseConstraint($constraint_string, $core_compatibility) {
     $p_major = '(?<major>\d+)';
     // By setting the minor version to x, branches can be matched.
     $p_minor = '(?<minor>(?:\d+|x)(?:-[A-Za-z]+\d+)?)';
+    // @todo@ if $p_minor is 'x', then there's no patch version for sure. Since we don't support 8.x.1 and 8.x.x is redundant with core compatibility check.
+    $p_patch = '(?<patch>(?:\d+|x)(?:-[A-Za-z]+\d+)?)';
     foreach (explode(',', $constraint_string) as $constraint) {
-      if (preg_match("/^\s*$p_op\s*$p_core$p_major\.$p_minor/", $constraint, $matches)) {
+      if (preg_match("/^\s*$p_op\s*$p_core$p_major\.$p_minor(\.$p_patch)?/", $constraint, $matches)) {
         $op = !empty($matches['operation']) ? $matches['operation'] : '=';
         if ($matches['minor'] == 'x') {
           // Drupal considers "2.x" to mean any version that begins with
@@ -127,7 +129,11 @@ private function parseConstraint($constraint_string, $core_compatibility) {
             $op = '>=';
           }
         }
-        $this->constraintArray[] = ['op' => $op, 'version' => $matches['major'] . '.' . $matches['minor']];
+        $version = $matches['major'] . '.' . $matches['minor'];
+        if (isset($matches['patch'])) {
+          $version .= '.' . $matches['patch'];
+        }
+        $this->constraintArray[] = ['op' => $op, 'version' => $version];
       }
     }
   }
diff --git a/core/modules/system/src/Controller/SystemController.php b/core/modules/system/src/Controller/SystemController.php
index 106f4e2915..4cc19c5994 100644
--- a/core/modules/system/src/Controller/SystemController.php
+++ b/core/modules/system/src/Controller/SystemController.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\system\Controller;
 
+use Drupal\Component\Version\Constraint;
 use Drupal\Core\Cache\CacheableMetadata;
 use Drupal\Core\Controller\ControllerBase;
 use Drupal\Core\Extension\ThemeHandlerInterface;
@@ -223,7 +224,7 @@ public function themesPage() {
 
       if (empty($theme->status)) {
         // Ensure this theme is compatible with this version of core.
-        $theme->incompatible_core = !isset($theme->info['core']) || ($theme->info['core'] != \DRUPAL::CORE_COMPATIBILITY);
+        $theme->incompatible_core = !isset($theme->info['core']) ||!(new Constraint($theme->info['core'], \Drupal::CORE_COMPATIBILITY))->isCompatible(\Drupal::VERSION);
         // Require the 'content' region to make sure the main page
         // content has a common place in all themes.
         $theme->incompatible_region = !isset($theme->info['regions']['content']);
diff --git a/core/modules/system/src/Form/ModulesListForm.php b/core/modules/system/src/Form/ModulesListForm.php
index cabbe2ebaa..e045e6df95 100644
--- a/core/modules/system/src/Form/ModulesListForm.php
+++ b/core/modules/system/src/Form/ModulesListForm.php
@@ -3,6 +3,7 @@
 namespace Drupal\system\Form;
 
 use Drupal\Component\Utility\Unicode;
+use Drupal\Component\Version\Constraint;
 use Drupal\Core\Config\PreExistingConfigException;
 use Drupal\Core\Config\UnmetDependenciesException;
 use Drupal\Core\Access\AccessManagerInterface;
@@ -295,10 +296,15 @@ protected function buildRow(array $modules, Extension $module, $distribution) {
     $reasons = [];
 
     // Check the core compatibility.
-    if ($module->info['core'] != \Drupal::CORE_COMPATIBILITY) {
+    if (!(new Constraint($module->info['core'], \Drupal::CORE_COMPATIBILITY))->isCompatible(\Drupal::VERSION)) {
       $compatible = FALSE;
       $reasons[] = $this->t('This version is not compatible with Drupal @core_version and should be replaced.', [
-        '@core_version' => \Drupal::CORE_COMPATIBILITY,
+        '@core_version' => \Drupal::VERSION,
+      ]);
+      $row['#requires']['core'] = $this->t('Drupal Core (@core_requirement) (<span class="admin-missing">incompatible with</span> version @core_version)', [
+        '@module' => $module->getName(),
+        '@core_requirement' => $module->info['core'],
+        '@core_version' => \Drupal::VERSION,
       ]);
     }
 
@@ -342,7 +348,7 @@ protected function buildRow(array $modules, Extension $module, $distribution) {
         }
         // Disable the checkbox if the dependency is incompatible with this
         // version of Drupal core.
-        elseif ($modules[$dependency]->info['core'] != \Drupal::CORE_COMPATIBILITY) {
+        elseif (!(new Constraint($modules[$dependency]->info['core'], \Drupal::CORE_COMPATIBILITY))->isCompatible(\Drupal::VERSION)) {
           $row['#requires'][$dependency] = $this->t('@module (<span class="admin-missing">incompatible with</span> this version of Drupal core)', [
             '@module' => $name,
           ]);
diff --git a/core/modules/system/tests/modules/system_incompatible_core_version_test_9x/system_incompatible_core_version_test_9x.info.yml b/core/modules/system/tests/modules/system_incompatible_core_version_test_9x/system_incompatible_core_version_test_9x.info.yml
new file mode 100644
index 0000000000..4bc6e455a0
--- /dev/null
+++ b/core/modules/system/tests/modules/system_incompatible_core_version_test_9x/system_incompatible_core_version_test_9x.info.yml
@@ -0,0 +1,6 @@
+name: 'System incompatible core 9.x version test'
+type: module
+description: 'Support module for testing system dependencies.'
+package: Testing
+version: 9.0.0
+core: 9.x
diff --git a/core/modules/system/tests/modules/system_test/system_test.module b/core/modules/system/tests/modules/system_test/system_test.module
index affc20ea42..bf96719f33 100644
--- a/core/modules/system/tests/modules/system_test/system_test.module
+++ b/core/modules/system/tests/modules/system_test/system_test.module
@@ -62,6 +62,10 @@ function system_test_system_info_alter(&$info, Extension $file, $type) {
     }
   }
 
+  if (($core_requirement = \Drupal::state()->get('dependency_test.core_version_requirement')) && $file->getName() === 'common_test') {
+    $info['core'] = $core_requirement;
+  }
+
   // Make the system_dependencies_test visible by default.
   if ($file->getName() == 'system_dependencies_test') {
     $info['hidden'] = FALSE;
@@ -71,6 +75,8 @@ function system_test_system_info_alter(&$info, Extension $file, $type) {
     'system_incompatible_core_version_dependencies_test',
     'system_incompatible_module_version_test',
     'system_incompatible_core_version_test',
+    'system_incompatible_core_version_test_9x',
+    'system_compatible_core_version_test_80x',
   ])) {
     $info['hidden'] = FALSE;
   }
diff --git a/core/modules/system/tests/src/Functional/Module/DependencyTest.php b/core/modules/system/tests/src/Functional/Module/DependencyTest.php
index 2e0e60923c..22f1c74382 100644
--- a/core/modules/system/tests/src/Functional/Module/DependencyTest.php
+++ b/core/modules/system/tests/src/Functional/Module/DependencyTest.php
@@ -102,6 +102,29 @@ public function testIncompatiblePhpVersionDependency() {
     $this->assert(count($checkbox) == 1, 'Checkbox for the module is disabled.');
   }
 
+  /**
+   * Tests enabling modules with different core version specifications.
+   */
+  public function testCoreVersionDependency() {
+    $assert_session = $this->assertSession();
+    $page = $this->getSession()->getPage();
+    list($major, $minor) = explode('.', \Drupal::VERSION);
+    $next_minor = "$major." . ((int) $minor + 1) . ".x";
+    \Drupal::state()->set('dependency_test.core_version_requirement', $next_minor);
+    $this->drupalGet('admin/modules');
+    $assert_session->fieldDisabled('modules[system_incompatible_core_version_test_9x][enable]');
+    $assert_session->fieldDisabled('modules[common_test][enable]');
+
+    $current_minor = "$major.$minor.x";
+    \Drupal::state()->set('dependency_test.core_version_requirement', $current_minor);
+    $this->drupalGet('admin/modules');
+    $checkbox = $page->find('css', '[name="modules[common_test][enable]"]');
+    $this->assertFalse($checkbox->hasAttribute('disabled'));
+    $edit['modules[common_test][enable]'] = 'common_test';
+    $this->drupalPostForm('admin/modules', $edit, t('Install'));
+    $this->assertModules(['common_test'], TRUE);
+  }
+
   /**
    * Tests enabling a module that depends on a module which fails hook_requirements().
    */
