diff --git a/package_manager/src/InstalledPackagesList.php b/package_manager/src/InstalledPackagesList.php
index abd7628cf9b899b9ee4c6fb5d214578e0548aa89..499c73120f0f3aa8ac8acda1ad1a13d39d1f8327 100644
--- a/package_manager/src/InstalledPackagesList.php
+++ b/package_manager/src/InstalledPackagesList.php
@@ -156,10 +156,14 @@ final class InstalledPackagesList extends \ArrayObject {
    *
    * Packages returned by ::getCorePackageList() are considered core packages.
    *
+   * @param bool $include_dev
+   *   (optional) Whether to include core packages intended for development.
+   *   Defaults to TRUE.
+   *
    * @return static
    *   A list of the installed core packages.
    */
-  public function getCorePackages(): static {
+  public function getCorePackages(bool $include_dev = TRUE): static {
     $core_packages = array_intersect_key(
       $this->getArrayCopy(),
       array_flip(static::getCorePackageList())
@@ -170,6 +174,10 @@ final class InstalledPackagesList extends \ArrayObject {
     if (array_key_exists('drupal/core-recommended', $core_packages)) {
       unset($core_packages['drupal/core']);
     }
+    if (!$include_dev) {
+      unset($core_packages['drupal/core-dev']);
+      unset($core_packages['drupal/core-dev-pinned']);
+    }
     return new static($core_packages);
   }
 
diff --git a/package_manager/tests/src/Unit/InstalledPackagesListTest.php b/package_manager/tests/src/Unit/InstalledPackagesListTest.php
index 247bb0f065c439d8b7e3573b1da8f3caa8303c34..3bd49e8ec5e9860bfa88903b88614223f3e38d1d 100644
--- a/package_manager/tests/src/Unit/InstalledPackagesListTest.php
+++ b/package_manager/tests/src/Unit/InstalledPackagesListTest.php
@@ -139,6 +139,14 @@ class InstalledPackagesListTest extends UnitTestCase {
     $list = new InstalledPackagesList($data);
     $this->assertArrayNotHasKey('drupal/not-core', $list->getCorePackages());
 
+    // Tests that we don't get core packages intended for development when
+    // include_dev is set to FALSE.
+    $core_packages_no_dev = $list->getCorePackages(FALSE);
+    $this->assertArrayNotHasKey('drupal/core-dev', $core_packages_no_dev);
+    $this->assertArrayNotHasKey('drupal/core-dev-pinned', $core_packages_no_dev);
+    // We still get other packages as intended.
+    $this->assertArrayHasKey('drupal/core', $core_packages_no_dev);
+
     // If drupal/core-recommended is in the list, it should supersede
     // drupal/core.
     $this->assertArrayHasKey('drupal/core', $list->getCorePackages());
diff --git a/src/Validator/VersionPolicyValidator.php b/src/Validator/VersionPolicyValidator.php
index bbba0577f78daa9a7dd6730d0e0261d09609903e..197c8ea7be3397223e6bb29373e6e7d9167a0d71 100644
--- a/src/Validator/VersionPolicyValidator.php
+++ b/src/Validator/VersionPolicyValidator.php
@@ -277,10 +277,8 @@ final class VersionPolicyValidator implements EventSubscriberInterface {
     $project_root = $this->pathLocator->getProjectRoot();
 
     $core_packages = $this->composerInspector->getInstalledPackagesList($project_root)
-      ->getCorePackages()
+      ->getCorePackages(FALSE)
       ->getArrayCopy();
-    unset($core_packages['drupal/core-dev']);
-    unset($core_packages['drupal/core-dev-pinned']);
 
     return key($core_packages) ?? FALSE;
   }