diff --git a/app/finders/packages/group_or_project_package_finder.rb b/app/finders/packages/group_or_project_package_finder.rb
index 470502ef58e1697cbfbec2958cc37fcfe1e5a53a..d1a8dfd923181f9468acc391b9317865ede0d1af 100644
--- a/app/finders/packages/group_or_project_package_finder.rb
+++ b/app/finders/packages/group_or_project_package_finder.rb
@@ -51,7 +51,7 @@ def group_packages
     end
 
     def packages_class
-      @params.fetch(:packages_class, ::Packages::Package)
+      ::Packages::Package
     end
   end
 end
diff --git a/app/finders/packages/pypi/package_finder.rb b/app/finders/packages/pypi/package_finder.rb
index 4026622171d2ce05fc36cb7eab43bc8f8949a9d4..37a01c8d1453af70b4eadf61c791e1a135039dc3 100644
--- a/app/finders/packages/pypi/package_finder.rb
+++ b/app/finders/packages/pypi/package_finder.rb
@@ -5,14 +5,6 @@ module Pypi
     class PackageFinder < ::Packages::GroupOrProjectPackageFinder
       extend ::Gitlab::Utils::Override
 
-      def initialize(current_user, project_or_group, params = {})
-        if Feature.enabled?(:pypi_extract_pypi_package_model, Feature.current_request)
-          params[:packages_class] = ::Packages::Pypi::Package
-        end
-
-        super
-      end
-
       def execute
         packages.by_file_name_and_sha256(@params[:filename], @params[:sha256])
       end
@@ -20,11 +12,7 @@ def execute
       private
 
       def packages
-        if Feature.enabled?(:pypi_extract_pypi_package_model, Feature.current_request)
-          base.has_version
-        else
-          base.pypi.has_version
-        end
+        base.has_version
       end
 
       override :group_packages
@@ -37,6 +25,11 @@ def group_packages
           @project_or_group.all_projects.select(:id)
         ).installable
       end
+
+      override :packages_class
+      def packages_class
+        ::Packages::Pypi::Package
+      end
     end
   end
 end
diff --git a/app/finders/packages/pypi/packages_finder.rb b/app/finders/packages/pypi/packages_finder.rb
index 2ba7eda72f100cfb2e99ff904ff26c0e9da2e78c..c2ca93a5844b3aedbcb5bcd94af2a8a4deaa9d69 100644
--- a/app/finders/packages/pypi/packages_finder.rb
+++ b/app/finders/packages/pypi/packages_finder.rb
@@ -5,14 +5,6 @@ module Pypi
     class PackagesFinder < ::Packages::GroupOrProjectPackageFinder
       extend ::Gitlab::Utils::Override
 
-      def initialize(current_user, project_or_group, params = {})
-        if Feature.enabled?(:pypi_extract_pypi_package_model, Feature.current_request)
-          params[:packages_class] = ::Packages::Pypi::Package
-        end
-
-        super
-      end
-
       def execute
         return packages unless @params[:package_name]
 
@@ -22,11 +14,7 @@ def execute
       private
 
       def packages
-        if Feature.enabled?(:pypi_extract_pypi_package_model, Feature.current_request)
-          base.has_version
-        else
-          base.pypi.has_version
-        end
+        base.has_version
       end
 
       override :group_packages
@@ -37,6 +25,11 @@ def group_packages
           with_package_registry_enabled: true
         )
       end
+
+      override :packages_class
+      def packages_class
+        ::Packages::Pypi::Package
+      end
     end
   end
 end
diff --git a/app/models/packages/package.rb b/app/models/packages/package.rb
index 3908fed3a94c6b5c47b5b6e9eb0830a171bdcb8f..94168c9cff6d3a337d86036e8e3aa447353fb734 100644
--- a/app/models/packages/package.rb
+++ b/app/models/packages/package.rb
@@ -44,10 +44,6 @@ class Packages::Package < ApplicationRecord
   has_many :dependency_links, inverse_of: :package, class_name: 'Packages::DependencyLink'
   has_many :tags, inverse_of: :package, class_name: 'Packages::Tag'
 
-  # TODO: Remove with the rollout of the FF pypi_extract_pypi_package_model
-  # https://gitlab.com/gitlab-org/gitlab/-/issues/480692
-  has_one :pypi_metadatum, inverse_of: :package, class_name: 'Packages::Pypi::Metadatum'
-
   has_one :maven_metadatum, inverse_of: :package, class_name: 'Packages::Maven::Metadatum'
   has_one :nuget_metadatum, inverse_of: :package, class_name: 'Packages::Nuget::Metadatum'
   has_many :nuget_symbols, inverse_of: :package, class_name: 'Packages::Nuget::Symbol'
@@ -79,10 +75,6 @@ class Packages::Package < ApplicationRecord
   validates :version, format: { with: Gitlab::Regex.nuget_version_regex }, if: :nuget?
   validates :version, format: { with: Gitlab::Regex.maven_version_regex }, if: -> { version? && maven? }
 
-  # TODO: Remove with the rollout of the FF pypi_extract_pypi_package_model
-  # https://gitlab.com/gitlab-org/gitlab/-/issues/480692
-  validates :version, format: { with: Gitlab::Regex.pypi_version_regex }, if: :pypi?
-
   validates :version, format: { with: Gitlab::Regex.semver_regex, message: Gitlab::Regex.semver_regex_message },
     if: -> { npm? || terraform_module? }
 
@@ -90,16 +82,6 @@ class Packages::Package < ApplicationRecord
   scope :with_name, ->(name) { where(name: name) }
   scope :with_name_like, ->(name) { where(arel_table[:name].matches(name)) }
 
-  # TODO: Remove with the rollout of the FF pypi_extract_pypi_package_model
-  # https://gitlab.com/gitlab-org/gitlab/-/issues/480692
-  scope :with_normalized_pypi_name, ->(name) do
-    where(
-      "LOWER(regexp_replace(name, ?, '-', 'g')) = ?",
-      Gitlab::Regex::Packages::PYPI_NORMALIZED_NAME_REGEX_STRING,
-      name.downcase
-    )
-  end
-
   scope :with_case_insensitive_version, ->(version) do
     where('LOWER(version) = ?', version.downcase)
   end
@@ -135,10 +117,6 @@ class Packages::Package < ApplicationRecord
   scope :preload_npm_metadatum, -> { preload(:npm_metadatum) }
   scope :preload_nuget_metadatum, -> { preload(:nuget_metadatum) }
 
-  # TODO: Remove with the rollout of the FF pypi_extract_pypi_package_model
-  # https://gitlab.com/gitlab-org/gitlab/-/issues/480692
-  scope :preload_pypi_metadatum, -> { preload(:pypi_metadatum) }
-
   scope :with_npm_scope, ->(scope) do
     npm.where("position('/' in packages_packages.name) > 0 AND split_part(packages_packages.name, '/', 1) = :package_scope", package_scope: "@#{sanitize_sql_like(scope)}")
   end
@@ -189,7 +167,7 @@ class Packages::Package < ApplicationRecord
   def self.inheritance_column = 'package_type'
 
   def self.inheritance_column_to_class_map
-    hash = {
+    {
       ml_model: 'Packages::MlModel::Package',
       golang: 'Packages::Go::Package',
       rubygems: 'Packages::Rubygems::Package',
@@ -198,14 +176,9 @@ def self.inheritance_column_to_class_map
       debian: 'Packages::Debian::Package',
       composer: 'Packages::Composer::Package',
       helm: 'Packages::Helm::Package',
-      generic: 'Packages::Generic::Package'
-    }
-
-    if Feature.enabled?(:pypi_extract_pypi_package_model, Feature.current_request)
-      hash[:pypi] = 'Packages::Pypi::Package'
-    end
-
-    hash
+      generic: 'Packages::Generic::Package',
+      pypi: 'Packages::Pypi::Package'
+    }.freeze
   end
 
   def self.only_maven_packages_with_path(path, use_cte: false)
@@ -329,16 +302,6 @@ def mark_package_files_for_destruction
     ::Packages::MarkPackageFilesForDestructionWorker.perform_async(id)
   end
 
-  # TODO: Remove with the rollout of the FF pypi_extract_pypi_package_model
-  # https://gitlab.com/gitlab-org/gitlab/-/issues/480692
-  #
-  # As defined in PEP 503 https://peps.python.org/pep-0503/#normalized-names
-  def normalized_pypi_name
-    return name unless pypi?
-
-    name.gsub(/#{Gitlab::Regex::Packages::PYPI_NORMALIZED_NAME_REGEX_STRING}/o, '-').downcase
-  end
-
   def normalized_nuget_version
     return unless nuget?
 
diff --git a/app/models/packages/pypi/metadatum.rb b/app/models/packages/pypi/metadatum.rb
index f251db30dc89fc99120e5e64bd4196c929b790cd..76410eddd07d49a40fc6c27737413dc33b779e18 100644
--- a/app/models/packages/pypi/metadatum.rb
+++ b/app/models/packages/pypi/metadatum.rb
@@ -15,17 +15,7 @@ class Packages::Pypi::Metadatum < ApplicationRecord
 
   belongs_to :package, class_name: 'Packages::Pypi::Package', inverse_of: :pypi_metadatum
 
-  # TODO: Remove with the rollout of the FF pypi_extract_pypi_package_model
-  # https://gitlab.com/gitlab-org/gitlab/-/issues/480692
-  belongs_to :legacy_package, -> {
-    where(package_type: :pypi)
-  }, inverse_of: :pypi_metadatum, class_name: 'Packages::Package', foreign_key: :package_id
-
-  validates :package, presence: true, if: -> { pypi_extract_pypi_package_model_enabled? }
-
-  # TODO: Remove with the rollout of the FF pypi_extract_pypi_package_model
-  # https://gitlab.com/gitlab-org/gitlab/-/issues/480692
-  validates :legacy_package, presence: true, unless: -> { pypi_extract_pypi_package_model_enabled? }
+  validates :package, presence: true
 
   with_options allow_nil: true do
     validates :keywords, length: { maximum: MAX_KEYWORDS_LENGTH }
@@ -36,19 +26,4 @@ class Packages::Pypi::Metadatum < ApplicationRecord
     validates :description_content_type, length: { maximum: MAX_DESCRIPTION_CONTENT_TYPE_LENGTH }
   end
   validates :required_python, length: { maximum: MAX_REQUIRED_PYTHON_LENGTH }, allow_nil: false
-
-  validate :pypi_package_type, unless: -> { pypi_extract_pypi_package_model_enabled? }
-
-  private
-
-  def pypi_package_type
-    unless legacy_package&.pypi?
-      errors.add(:base, _('Package type must be PyPi'))
-    end
-  end
-
-  def pypi_extract_pypi_package_model_enabled?
-    Feature.enabled?(:pypi_extract_pypi_package_model, Feature.current_request)
-  end
-  strong_memoize_attr :pypi_extract_pypi_package_model_enabled?
 end
diff --git a/app/services/packages/pypi/create_package_service.rb b/app/services/packages/pypi/create_package_service.rb
index 61333674161b00cb0f9998522c1f7b6612d1dbdf..2c943fa7d4e13b7136dba9852255f31c62746ead 100644
--- a/app/services/packages/pypi/create_package_service.rb
+++ b/app/services/packages/pypi/create_package_service.rb
@@ -8,6 +8,7 @@ class CreatePackageService < ::Packages::CreatePackageService
       def execute
         ::Packages::Package.transaction do
           meta = Packages::Pypi::Metadatum.new(
+            package: created_package,
             required_python: params[:requires_python] || '',
             metadata_version: params[:metadata_version],
             author_email: params[:author_email],
@@ -17,12 +18,6 @@ def execute
             keywords: params[:keywords]
           )
 
-          if Feature.enabled?(:pypi_extract_pypi_package_model, Feature.current_request)
-            meta.package = created_package
-          else
-            meta.legacy_package = created_package
-          end
-
           truncate_fields(meta)
 
           raise ActiveRecord::RecordInvalid, meta unless meta.valid?
diff --git a/config/feature_flags/gitlab_com_derisk/pypi_extract_pypi_package_model.yml b/config/feature_flags/gitlab_com_derisk/pypi_extract_pypi_package_model.yml
deleted file mode 100644
index eec05654aee4de4af64f82591c78554019226f3e..0000000000000000000000000000000000000000
--- a/config/feature_flags/gitlab_com_derisk/pypi_extract_pypi_package_model.yml
+++ /dev/null
@@ -1,9 +0,0 @@
----
-name: pypi_extract_pypi_package_model
-feature_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/435827
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/165694
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/480692
-milestone: '17.5'
-group: group::package registry
-type: gitlab_com_derisk
-default_enabled: false
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index e6918631ebc5e0eba9ea520a723a4a22d82f5f87..86d7bb02195e638407279c2bf96ba42647a4b705 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -38629,9 +38629,6 @@ msgstr ""
 msgid "Package type must be NuGet"
 msgstr ""
 
-msgid "Package type must be PyPi"
-msgstr ""
-
 msgid "Package type must be Terraform Module"
 msgstr ""
 
diff --git a/spec/factories/packages/packages.rb b/spec/factories/packages/packages.rb
index 53337e75ff3fa0628eb6c643b6260d9ad599c173..37ffa429ddf80db3839492e27cf1e2f969bb9022 100644
--- a/spec/factories/packages/packages.rb
+++ b/spec/factories/packages/packages.rb
@@ -121,26 +121,6 @@
       end
     end
 
-    # TODO: Remove with the rollout of the FF pypi_extract_pypi_package_model
-    # https://gitlab.com/gitlab-org/gitlab/-/issues/480692
-    factory :pypi_package_legacy do
-      sequence(:name) { |n| "pypi-package-#{n}" }
-      sequence(:version) { |n| "1.0.#{n}" }
-      package_type { :pypi }
-
-      transient do
-        without_loaded_metadatum { false }
-      end
-
-      after :create do |package, evaluator|
-        create :package_file, :pypi, package: package, file_name: "#{package.name}-#{package.version}.tar.gz"
-
-        unless evaluator.without_loaded_metadatum
-          create :pypi_metadatum, legacy_package: package, package: nil
-        end
-      end
-    end
-
     factory :ml_model_package, class: 'Packages::MlModel::Package' do
       sequence(:name) { |n| "mlmodel-package-#{n}" }
       sequence(:version) { |n| "1.0.#{n}" }
diff --git a/spec/finders/packages/pypi/package_finder_spec.rb b/spec/finders/packages/pypi/package_finder_spec.rb
index 0b0098884c441fbb0a33732fb7c14ea4104e5c16..5d331d69e774940bb7233aa6cb264265331b1ae1 100644
--- a/spec/finders/packages/pypi/package_finder_spec.rb
+++ b/spec/finders/packages/pypi/package_finder_spec.rb
@@ -33,27 +33,5 @@
 
       it { is_expected.to eq(package2) }
     end
-
-    context 'when pypi_extract_package_model is disabled' do
-      before do
-        stub_feature_flags(pypi_extract_pypi_package_model: false)
-      end
-
-      context 'within a project' do
-        let(:scope) { project }
-
-        # rubocop:disable Cop/AvoidBecomes -- implementing inheritance for PyPi packages https://gitlab.com/gitlab-org/gitlab/-/issues/435827
-        it { is_expected.to eq(package2.becomes(::Packages::Package)) }
-        # rubocop:enable Cop/AvoidBecomes
-      end
-
-      context 'within a group' do
-        let(:scope) { group }
-
-        # rubocop:disable Cop/AvoidBecomes -- implementing inheritance for PyPi packages https://gitlab.com/gitlab-org/gitlab/-/issues/435827
-        it { is_expected.to eq(package2.becomes(::Packages::Package)) }
-        # rubocop:enable Cop/AvoidBecomes
-      end
-    end
   end
 end
diff --git a/spec/finders/packages/pypi/packages_finder_spec.rb b/spec/finders/packages/pypi/packages_finder_spec.rb
index 73d5f7554cfad1157258a0c6a0e9c6a97c51e9b3..1823ce532ededf761f6afc50c22c705220cedbb1 100644
--- a/spec/finders/packages/pypi/packages_finder_spec.rb
+++ b/spec/finders/packages/pypi/packages_finder_spec.rb
@@ -39,19 +39,6 @@
 
         it { is_expected.to contain_exactly(package2, package3) }
 
-        context 'when pypi_extract_package_model is disabled' do
-          before do
-            stub_feature_flags(pypi_extract_pypi_package_model: false)
-          end
-
-          # rubocop:disable Cop/AvoidBecomes -- implementing inheritance for PyPi packages https://gitlab.com/gitlab-org/gitlab/-/issues/435827
-          it do
-            is_expected
-              .to contain_exactly(package2.becomes(::Packages::Package), package3.becomes(::Packages::Package))
-          end
-          # rubocop:enable Cop/AvoidBecomes
-        end
-
         it_behaves_like 'when no package is found'
         it_behaves_like 'when package_name param is a non-normalized name'
       end
@@ -68,16 +55,6 @@
 
           it { is_expected.to contain_exactly(package4) }
 
-          context 'when pypi_extract_package_model is disabled' do
-            before do
-              stub_feature_flags(pypi_extract_pypi_package_model: false)
-            end
-
-            # rubocop:disable Cop/AvoidBecomes -- implementing inheritance for PyPi packages https://gitlab.com/gitlab-org/gitlab/-/issues/435827
-            it { is_expected.to contain_exactly(package4.becomes(::Packages::Package)) }
-            # rubocop:enable Cop/AvoidBecomes
-          end
-
           it_behaves_like 'when no package is found'
           it_behaves_like 'when package_name param is a non-normalized name'
 
diff --git a/spec/models/packages/package_spec.rb b/spec/models/packages/package_spec.rb
index ee3f55fcc2e0df3cdebc55a58fd01f2c80a8cb16..cc806e77be3fc249d2bbcffa69fa410e99d1cfa0 100644
--- a/spec/models/packages/package_spec.rb
+++ b/spec/models/packages/package_spec.rb
@@ -182,75 +182,6 @@
         it { is_expected.not_to allow_value('%2e%2e%2f1.2.3').for(:version) }
       end
 
-      # TODO: Remove with the rollout of the FF pypi_extract_pypi_package_model
-      # https://gitlab.com/gitlab-org/gitlab/-/issues/480692
-      context 'pypi package' do
-        subject { create(:pypi_package_legacy) }
-
-        it { is_expected.to allow_value('0.1').for(:version) }
-        it { is_expected.to allow_value('2.0').for(:version) }
-        it { is_expected.to allow_value('1.2.0').for(:version) }
-        it { is_expected.to allow_value('0100!0.0').for(:version) }
-        it { is_expected.to allow_value('00!1.2').for(:version) }
-        it { is_expected.to allow_value('1.0a').for(:version) }
-        it { is_expected.to allow_value('1.0-a').for(:version) }
-        it { is_expected.to allow_value('1.0.a1').for(:version) }
-        it { is_expected.to allow_value('1.0a1').for(:version) }
-        it { is_expected.to allow_value('1.0-a1').for(:version) }
-        it { is_expected.to allow_value('1.0alpha1').for(:version) }
-        it { is_expected.to allow_value('1.0b1').for(:version) }
-        it { is_expected.to allow_value('1.0beta1').for(:version) }
-        it { is_expected.to allow_value('1.0rc1').for(:version) }
-        it { is_expected.to allow_value('1.0pre1').for(:version) }
-        it { is_expected.to allow_value('1.0preview1').for(:version) }
-        it { is_expected.to allow_value('1.0.dev1').for(:version) }
-        it { is_expected.to allow_value('1.0.DEV1').for(:version) }
-        it { is_expected.to allow_value('1.0.post1').for(:version) }
-        it { is_expected.to allow_value('1.0.rev1').for(:version) }
-        it { is_expected.to allow_value('1.0.r1').for(:version) }
-        it { is_expected.to allow_value('1.0c2').for(:version) }
-        it { is_expected.to allow_value('2012.15').for(:version) }
-        it { is_expected.to allow_value('1.0+5').for(:version) }
-        it { is_expected.to allow_value('1.0+abc.5').for(:version) }
-        it { is_expected.to allow_value('1!1.1').for(:version) }
-        it { is_expected.to allow_value('1.0c3').for(:version) }
-        it { is_expected.to allow_value('1.0rc2').for(:version) }
-        it { is_expected.to allow_value('1.0c1').for(:version) }
-        it { is_expected.to allow_value('1.0b2-346').for(:version) }
-        it { is_expected.to allow_value('1.0b2.post345').for(:version) }
-        it { is_expected.to allow_value('1.0b2.post345.dev456').for(:version) }
-        it { is_expected.to allow_value('1.2.rev33+123456').for(:version) }
-        it { is_expected.to allow_value('1.1.dev1').for(:version) }
-        it { is_expected.to allow_value('1.0b1.dev456').for(:version) }
-        it { is_expected.to allow_value('1.0a12.dev456').for(:version) }
-        it { is_expected.to allow_value('1.0b2').for(:version) }
-        it { is_expected.to allow_value('1.0.dev456').for(:version) }
-        it { is_expected.to allow_value('1.0c1.dev456').for(:version) }
-        it { is_expected.to allow_value('1.0.post456').for(:version) }
-        it { is_expected.to allow_value('1.0.post456.dev34').for(:version) }
-        it { is_expected.to allow_value('1.2+123abc').for(:version) }
-        it { is_expected.to allow_value('1.2+abc').for(:version) }
-        it { is_expected.to allow_value('1.2+abc123').for(:version) }
-        it { is_expected.to allow_value('1.2+abc123def').for(:version) }
-        it { is_expected.to allow_value('1.2+1234.abc').for(:version) }
-        it { is_expected.to allow_value('1.2+123456').for(:version) }
-        it { is_expected.to allow_value('1.2.r32+123456').for(:version) }
-        it { is_expected.to allow_value('1!1.2.rev33+123456').for(:version) }
-        it { is_expected.to allow_value('1.0a12').for(:version) }
-        it { is_expected.to allow_value('1.2.3-45+abcdefgh').for(:version) }
-        it { is_expected.to allow_value('v1.2.3').for(:version) }
-        it { is_expected.not_to allow_value('1.2.3-45-abcdefgh').for(:version) }
-        it { is_expected.not_to allow_value('..1.2.3').for(:version) }
-        it { is_expected.not_to allow_value('  1.2.3').for(:version) }
-        it { is_expected.not_to allow_value("1.2.3  \r\t").for(:version) }
-        it { is_expected.not_to allow_value("\r\t 1.2.3").for(:version) }
-        it { is_expected.not_to allow_value('1./2.3').for(:version) }
-        it { is_expected.not_to allow_value('1.2.3-4/../../').for(:version) }
-        it { is_expected.not_to allow_value('1.2.3-4%2e%2e%').for(:version) }
-        it { is_expected.not_to allow_value('../../../../../1.2.3').for(:version) }
-        it { is_expected.not_to allow_value('%2e%2e%2f1.2.3').for(:version) }
-      end
-
       it_behaves_like 'validating version to be SemVer compliant for', :npm_package
       it_behaves_like 'validating version to be SemVer compliant for', :terraform_module_package
 
@@ -644,16 +575,6 @@
       it { is_expected.to match_array([package1, package2]) }
     end
 
-    # TODO: Remove with the rollout of the FF pypi_extract_pypi_package_model
-    # https://gitlab.com/gitlab-org/gitlab/-/issues/480692
-    describe '.with_normalized_pypi_name' do
-      let_it_be(:pypi_package) { create(:pypi_package, name: 'Foo.bAr---BAZ_buz') }
-
-      subject { described_class.with_normalized_pypi_name('foo-bar-baz-buz') }
-
-      it { is_expected.to match_array([pypi_package]) }
-    end
-
     describe '.with_case_insensitive_version' do
       let_it_be(:nuget_package) { create(:nuget_package, version: '1.0.0-ABC') }
 
@@ -1105,28 +1026,6 @@
     end
   end
 
-  # TODO: Remove with the rollout of the FF pypi_extract_pypi_package_model
-  # https://gitlab.com/gitlab-org/gitlab/-/issues/480692
-  describe '#normalized_pypi_name' do
-    let_it_be(:package) { create(:pypi_package) }
-
-    subject { package.normalized_pypi_name }
-
-    where(:package_name, :normalized_name) do
-      'ASDF' | 'asdf'
-      'a.B_c-d' | 'a-b-c-d'
-      'a-------b....c___d' | 'a-b-c-d'
-    end
-
-    with_them do
-      before do
-        package.update_column(:name, package_name)
-      end
-
-      it { is_expected.to eq(normalized_name) }
-    end
-  end
-
   describe '#normalized_nuget_version' do
     let_it_be(:package) { create(:nuget_package, :with_metadatum, version: '1.0') }
     let(:normalized_version) { '1.0.0' }
diff --git a/spec/models/packages/pypi/metadatum_spec.rb b/spec/models/packages/pypi/metadatum_spec.rb
index c556c482b5ecfd5fce647fafd17e47b441136df1..cf56e97dd89ca3b13b102e720da2c265b9f68538 100644
--- a/spec/models/packages/pypi/metadatum_spec.rb
+++ b/spec/models/packages/pypi/metadatum_spec.rb
@@ -5,31 +5,11 @@
 RSpec.describe Packages::Pypi::Metadatum, type: :model, feature_category: :package_registry do
   describe 'relationships' do
     it { is_expected.to belong_to(:package) }
-
-    # TODO: Remove with the rollout of the FF pypi_extract_pypi_package_model
-    # https://gitlab.com/gitlab-org/gitlab/-/issues/480692
-    it do
-      is_expected.to belong_to(:legacy_package).conditions(package_type: :pypi).class_name('Packages::Package')
-        .inverse_of(:pypi_metadatum).with_foreign_key(:package_id)
-    end
   end
 
   describe 'validations' do
     it { is_expected.to validate_presence_of(:package) }
 
-    # TODO: Remove with the rollout of the FF pypi_extract_pypi_package_model
-    # https://gitlab.com/gitlab-org/gitlab/-/issues/480692
-    it { is_expected.not_to validate_presence_of(:legacy_package) }
-
-    context 'when pypi_extract_package_model is disabled' do
-      before do
-        stub_feature_flags(pypi_extract_pypi_package_model: false)
-      end
-
-      it { is_expected.to validate_presence_of(:legacy_package) }
-      it { is_expected.not_to validate_presence_of(:package) }
-    end
-
     it { is_expected.to allow_value('').for(:required_python) }
     it { is_expected.to validate_length_of(:required_python).is_at_most(described_class::MAX_REQUIRED_PYTHON_LENGTH) }
     it { is_expected.to allow_value('').for(:keywords) }
@@ -55,7 +35,7 @@
         .is_at_most(described_class::MAX_DESCRIPTION_CONTENT_TYPE_LENGTH)
     }
 
-    describe '#pypi_package_type', :aggregate_failures do
+    describe '#package_type', :aggregate_failures do
       subject(:pypi_metadatum) { build(:pypi_metadatum) }
 
       it 'builds a valid metadatum' do
@@ -69,19 +49,6 @@
         it 'raises the error' do
           expect { build(:pypi_metadatum, package: package) }.to raise_error(ActiveRecord::AssociationTypeMismatch)
         end
-
-        context 'when pypi_extract_package_model is disabled' do
-          before do
-            stub_feature_flags(pypi_extract_pypi_package_model: false)
-          end
-
-          it 'adds the validation error' do
-            pypi_metadatum = build(:pypi_metadatum, legacy_package: package, package: nil)
-
-            expect(pypi_metadatum).not_to be_valid
-            expect(pypi_metadatum.errors.to_a).to include('Package type must be PyPi')
-          end
-        end
       end
     end
   end
diff --git a/spec/presenters/packages/pypi/simple_index_presenter_spec.rb b/spec/presenters/packages/pypi/simple_index_presenter_spec.rb
index f7ea970656b1bf395b5f28e8c3e6f24f2e498444..eb167d673985a48c1dabe67a949b189d0b32bcc5 100644
--- a/spec/presenters/packages/pypi/simple_index_presenter_spec.rb
+++ b/spec/presenters/packages/pypi/simple_index_presenter_spec.rb
@@ -11,7 +11,7 @@
   let_it_be(:package1) { create(:pypi_package, project: project, name: package_name, version: '1.0.0') }
   let_it_be(:package2) { create(:pypi_package, project: project, name: package_name, version: '2.0.0') }
 
-  let(:packages) { project.packages }
+  let(:packages) { Packages::Pypi::Package.for_projects(project) }
 
   describe '#body' do
     subject(:presenter) { described_class.new(packages, project_or_group).body }
@@ -44,12 +44,12 @@
 
       it 'avoids n+1 database queries', :use_sql_query_cache do
         control = ActiveRecord::QueryRecorder.new(skip_cached: false) do
-          described_class.new(project.packages.reload, project_or_group).body
+          described_class.new(Packages::Pypi::Package.for_projects(project).reload, project_or_group).body
         end
 
         create_list(:pypi_package, 5, project: project)
 
-        expect { described_class.new(project.packages.reload, project_or_group).body }
+        expect { described_class.new(Packages::Pypi::Package.for_projects(project).reload, project_or_group).body }
           .to issue_same_number_of_queries_as(control)
       end
     end
diff --git a/spec/presenters/packages/pypi/simple_package_versions_presenter_spec.rb b/spec/presenters/packages/pypi/simple_package_versions_presenter_spec.rb
index 50a5cb631f94f11081d4487a7fe9378e5b502ac3..9ad2699943776d2dfc26aa0356322f49ff735ba6 100644
--- a/spec/presenters/packages/pypi/simple_package_versions_presenter_spec.rb
+++ b/spec/presenters/packages/pypi/simple_package_versions_presenter_spec.rb
@@ -13,7 +13,7 @@
 
   let(:file) { package.package_files.first }
   let(:filename) { file.file_name }
-  let(:packages) { project.packages }
+  let(:packages) { Packages::Pypi::Package.for_projects(project) }
 
   describe '#body' do
     subject(:presenter) { described_class.new(packages, project_or_group).body }
@@ -42,7 +42,8 @@
 
         create(:pypi_package, project: project, name: package_name)
 
-        expect { described_class.new(project.packages, project_or_group).body }.not_to exceed_query_limit(control)
+        expect { described_class.new(Packages::Pypi::Package.for_projects(project), project_or_group).body }
+          .not_to exceed_query_limit(control)
       end
     end
 
diff --git a/spec/requests/api/pypi_packages_spec.rb b/spec/requests/api/pypi_packages_spec.rb
index 34d4410f9ac1118002f808771738c78e6cd77e7b..10a5885e98a0a6a2c94517c9fa567f38a8c36ecf 100644
--- a/spec/requests/api/pypi_packages_spec.rb
+++ b/spec/requests/api/pypi_packages_spec.rb
@@ -328,7 +328,7 @@ def snowplow_context(user_role: :developer)
           end
 
           it 'returns 422 and does not create a package' do
-            expect { subject }.not_to change { project.packages.pypi.count }
+            expect { subject }.not_to change { Packages::Pypi::Package.for_projects(project).count }
 
             expect(response).to have_gitlab_http_status(:unprocessable_entity)
           end
@@ -424,7 +424,7 @@ def snowplow_context(user_role: :developer)
 
       it 'does not create a new package', :aggregate_failures do
         expect { subject }
-          .to change { project.packages.pypi.count }.by(0)
+          .to change { Packages::Pypi::Package.for_projects(project).count }.by(0)
           .and change { Packages::PackageFile.count }.by(1)
           .and change { Packages::Pypi::Metadatum.count }.by(0)
         expect(response).to have_gitlab_http_status(:created)
@@ -434,7 +434,7 @@ def snowplow_context(user_role: :developer)
         it 'does create a new package', :aggregate_failures do
           existing_package.pending_destruction!
           expect { subject }
-            .to change { project.packages.pypi.count }.by(1)
+            .to change { Packages::Pypi::Package.for_projects(project).count }.by(1)
             .and change { Packages::PackageFile.count }.by(1)
             .and change { Packages::Pypi::Metadatum.count }.by(1)
           expect(response).to have_gitlab_http_status(:created)
diff --git a/spec/services/packages/pypi/create_package_service_spec.rb b/spec/services/packages/pypi/create_package_service_spec.rb
index 70f623d840209ff8ffcb1eb29a64674f96ac03c5..3d9b5d443454e29fe8eb43a16b46aa4127c0b351 100644
--- a/spec/services/packages/pypi/create_package_service_spec.rb
+++ b/spec/services/packages/pypi/create_package_service_spec.rb
@@ -42,16 +42,6 @@
         expect(created_package.package_files.first.file_sha256).to eq sha256
         expect(created_package.package_files.first.file_md5).to eq md5
       end
-
-      context 'when pypi_extract_package_model is disabled' do
-        before do
-          stub_feature_flags(pypi_extract_pypi_package_model: false)
-        end
-
-        it 'creates the package' do
-          expect { execute_service }.to change { Packages::Package.pypi.count }.by(1)
-        end
-      end
     end
 
     context 'with FIPS mode', :fips_mode do
diff --git a/spec/support/shared_examples/requests/api/pypi_packages_shared_examples.rb b/spec/support/shared_examples/requests/api/pypi_packages_shared_examples.rb
index 9bd430c3b4f206fc5bd8a180574f0c67d2393282..6201e21ae98434fa37a29aee74fd6292c6843f10 100644
--- a/spec/support/shared_examples/requests/api/pypi_packages_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/pypi_packages_shared_examples.rb
@@ -4,7 +4,7 @@
   RSpec.shared_examples 'creating pypi package files' do
     it 'creates package files' do
       expect { subject }
-          .to change { project.packages.pypi.count }.by(1)
+          .to change { Packages::Pypi::Package.for_projects(project).count }.by(1)
           .and change { Packages::PackageFile.count }.by(1)
           .and change { Packages::Pypi::Metadatum.count }.by(1)
       expect(response).to have_gitlab_http_status(status)
@@ -37,7 +37,7 @@
         create(:package_file, :pypi, package: existing_package, file_name: params[:content].original_filename)
 
         expect { subject }
-            .to change { project.packages.pypi.count }.by(0)
+            .to change { Packages::Pypi::Package.for_projects(project).count }.by(0)
             .and change { Packages::PackageFile.count }.by(0)
             .and change { Packages::Pypi::Metadatum.count }.by(0)