diff --git a/app/graphql/queries/container_registry/get_container_repositories.query.graphql b/app/graphql/queries/container_registry/get_container_repositories.query.graphql
index 17fddd4d6be3f0aa3d3824ecc0927488db00ae2b..c3aa9cbd2bca951d453604bdab800d85a9650957 100644
--- a/app/graphql/queries/container_registry/get_container_repositories.query.graphql
+++ b/app/graphql/queries/container_registry/get_container_repositories.query.graphql
@@ -69,7 +69,6 @@ query getProjectContainerRepositories(
         path
         status
         location
-        canDelete
         createdAt
         expirationPolicyStartedAt
         expirationPolicyCleanupStatus
diff --git a/app/graphql/types/container_repository_details_type.rb b/app/graphql/types/container_repository_details_type.rb
index 3c5e010efc888b30686a390d9955d8099f7b4389..0ecfc5d35b09c2a9208d55a9b38b2b83196c80e6 100644
--- a/app/graphql/types/container_repository_details_type.rb
+++ b/app/graphql/types/container_repository_details_type.rb
@@ -29,10 +29,6 @@ class ContainerRepositoryDetailsType < Types::ContainerRepositoryType
           null: true,
           description: 'Deduplicated size of the image repository in bytes. This is only available on GitLab.com for repositories created after `2021-11-04`.'
 
-    def can_delete
-      Ability.allowed?(current_user, :destroy_container_image, object)
-    end
-
     def size
       handling_errors { object.size }
     end
diff --git a/app/graphql/types/container_repository_tag_type.rb b/app/graphql/types/container_repository_tag_type.rb
index 7691844645a6c71f51f7b67fee0202e0e25ee7c2..3fa08ed09b261a12b5049045d95b7361a4579958 100644
--- a/app/graphql/types/container_repository_tag_type.rb
+++ b/app/graphql/types/container_repository_tag_type.rb
@@ -10,13 +10,6 @@ class ContainerRepositoryTagType < BaseObject
 
     expose_permissions Types::PermissionTypes::ContainerRepositoryTag
 
-    field :can_delete, GraphQL::Types::Boolean,
-      null: false,
-      deprecated: {
-        reason: 'Use `userPermissions` field. See `ContainerRepositoryTagPermissions` type',
-        milestone: '16.7'
-      },
-      description: 'Can the current user delete this tag.'
     field :created_at, Types::TimeType, null: true, description: 'Timestamp when the tag was created.'
     field :digest, GraphQL::Types::String, null: true, description: 'Digest of the tag.'
     field :location, GraphQL::Types::String, null: false, description: 'URL of the tag.'
@@ -27,9 +20,5 @@ class ContainerRepositoryTagType < BaseObject
     field :revision, GraphQL::Types::String, null: true, description: 'Revision of the tag.'
     field :short_revision, GraphQL::Types::String, null: true, description: 'Short revision of the tag.'
     field :total_size, GraphQL::Types::BigInt, null: true, description: 'Size of the tag.'
-
-    def can_delete
-      Ability.allowed?(current_user, :destroy_container_image, object)
-    end
   end
 end
diff --git a/app/graphql/types/container_repository_type.rb b/app/graphql/types/container_repository_type.rb
index c2a7eae5f9418fa271e99c2856ab632e302ffb44..f97e2a76192a2688305010ff0e33f03248621d40 100644
--- a/app/graphql/types/container_repository_type.rb
+++ b/app/graphql/types/container_repository_type.rb
@@ -10,13 +10,6 @@ class ContainerRepositoryType < BaseObject
 
     expose_permissions Types::PermissionTypes::ContainerRepository
 
-    field :can_delete, GraphQL::Types::Boolean,
-      null: false,
-      deprecated: {
-        reason: 'Use `userPermissions` field. See `ContainerRepositoryPermissions` type',
-        milestone: '16.7'
-      },
-      description: 'Can the current user delete the container repository.'
     field :created_at, Types::TimeType, null: false, description: 'Timestamp when the container repository was created.'
     field :expiration_policy_cleanup_status, Types::ContainerRepositoryCleanupStatusEnum, null: true, description: 'Tags cleanup status for the container repository.'
     field :expiration_policy_started_at, Types::TimeType, null: true, description: 'Timestamp when the cleanup done by the expiration policy was started on the container repository.'
@@ -31,10 +24,6 @@ class ContainerRepositoryType < BaseObject
     field :tags_count, GraphQL::Types::Int, null: false, description: 'Number of tags associated with this image.'
     field :updated_at, Types::TimeType, null: false, description: 'Timestamp when the container repository was updated.'
 
-    def can_delete
-      Ability.allowed?(current_user, :update_container_image, object)
-    end
-
     def project
       Gitlab::Graphql::Loaders::BatchModelLoader.new(Project, object.project_id).find
     end
diff --git a/app/graphql/types/packages/package_base_type.rb b/app/graphql/types/packages/package_base_type.rb
index 278119c78e245e077c3f695ebe2f548e970c221e..1ab04223f7701e73f9d6202e001b7020a565b969 100644
--- a/app/graphql/types/packages/package_base_type.rb
+++ b/app/graphql/types/packages/package_base_type.rb
@@ -16,13 +16,6 @@ class PackageBaseType < ::Types::BaseObject
 
       field :_links, Types::Packages::PackageLinksType, null: false, method: :itself,
         description: 'Map of links to perform actions on the package.'
-      field :can_destroy, GraphQL::Types::Boolean,
-        null: false,
-        deprecated: {
-          reason: 'Superseded by `user_permissions` field. See `Types::PermissionTypes::Package` type',
-          milestone: '16.6'
-        },
-        description: 'Whether the user can destroy the package.'
       field :created_at, Types::TimeType, null: false, description: 'Date of creation.'
       field :metadata, Types::Packages::MetadataType,
         null: true,
@@ -46,10 +39,6 @@ def project
         Gitlab::Graphql::Loaders::BatchModelLoader.new(Project, object.project_id).find
       end
 
-      def can_destroy
-        Ability.allowed?(current_user, :destroy_package, object)
-      end
-
       def package_protection_rule_exists
         return false if Feature.disabled?(:packages_protected_packages, object.project)
 
diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md
index af5601e9db4cf020a7515f58610e8c52f0753e2f..e2304f6c1ccdae6eb152d75418828fd7e4a9b184 100644
--- a/doc/api/graphql/reference/index.md
+++ b/doc/api/graphql/reference/index.md
@@ -18170,7 +18170,6 @@ A container repository.
 
 | Name | Type | Description |
 | ---- | ---- | ----------- |
-| <a id="containerrepositorycandelete"></a>`canDelete` **{warning-solid}** | [`Boolean!`](#boolean) | **Deprecated** in GitLab 16.7. Use `userPermissions` field. See `ContainerRepositoryPermissions` type. |
 | <a id="containerrepositorycreatedat"></a>`createdAt` | [`Time!`](#time) | Timestamp when the container repository was created. |
 | <a id="containerrepositoryexpirationpolicycleanupstatus"></a>`expirationPolicyCleanupStatus` | [`ContainerRepositoryCleanupStatus`](#containerrepositorycleanupstatus) | Tags cleanup status for the container repository. |
 | <a id="containerrepositoryexpirationpolicystartedat"></a>`expirationPolicyStartedAt` | [`Time`](#time) | Timestamp when the cleanup done by the expiration policy was started on the container repository. |
@@ -18194,7 +18193,6 @@ Details of a container repository.
 
 | Name | Type | Description |
 | ---- | ---- | ----------- |
-| <a id="containerrepositorydetailscandelete"></a>`canDelete` **{warning-solid}** | [`Boolean!`](#boolean) | **Deprecated** in GitLab 16.7. Use `userPermissions` field. See `ContainerRepositoryPermissions` type. |
 | <a id="containerrepositorydetailscreatedat"></a>`createdAt` | [`Time!`](#time) | Timestamp when the container repository was created. |
 | <a id="containerrepositorydetailsexpirationpolicycleanupstatus"></a>`expirationPolicyCleanupStatus` | [`ContainerRepositoryCleanupStatus`](#containerrepositorycleanupstatus) | Tags cleanup status for the container repository. |
 | <a id="containerrepositorydetailsexpirationpolicystartedat"></a>`expirationPolicyStartedAt` | [`Time`](#time) | Timestamp when the cleanup done by the expiration policy was started on the container repository. |
@@ -18296,7 +18294,6 @@ A tag from a container repository.
 
 | Name | Type | Description |
 | ---- | ---- | ----------- |
-| <a id="containerrepositorytagcandelete"></a>`canDelete` **{warning-solid}** | [`Boolean!`](#boolean) | **Deprecated** in GitLab 16.7. Use `userPermissions` field. See `ContainerRepositoryTagPermissions` type. |
 | <a id="containerrepositorytagcreatedat"></a>`createdAt` | [`Time`](#time) | Timestamp when the tag was created. |
 | <a id="containerrepositorytagdigest"></a>`digest` | [`String`](#string) | Digest of the tag. |
 | <a id="containerrepositorytaglocation"></a>`location` | [`String!`](#string) | URL of the tag. |
@@ -25686,7 +25683,6 @@ Represents a package with pipelines in the Package Registry.
 | Name | Type | Description |
 | ---- | ---- | ----------- |
 | <a id="package_links"></a>`_links` | [`PackageLinks!`](#packagelinks) | Map of links to perform actions on the package. |
-| <a id="packagecandestroy"></a>`canDestroy` **{warning-solid}** | [`Boolean!`](#boolean) | **Deprecated** in GitLab 16.6. Superseded by `user_permissions` field. See `Types::PermissionTypes::Package` type. |
 | <a id="packagecreatedat"></a>`createdAt` | [`Time!`](#time) | Date of creation. |
 | <a id="packageid"></a>`id` | [`PackagesPackageID!`](#packagespackageid) | ID of the package. |
 | <a id="packagemetadata"></a>`metadata` | [`PackageMetadata`](#packagemetadata) | Package metadata. |
@@ -25711,7 +25707,6 @@ Represents a package in the Package Registry.
 | Name | Type | Description |
 | ---- | ---- | ----------- |
 | <a id="packagebase_links"></a>`_links` | [`PackageLinks!`](#packagelinks) | Map of links to perform actions on the package. |
-| <a id="packagebasecandestroy"></a>`canDestroy` **{warning-solid}** | [`Boolean!`](#boolean) | **Deprecated** in GitLab 16.6. Superseded by `user_permissions` field. See `Types::PermissionTypes::Package` type. |
 | <a id="packagebasecreatedat"></a>`createdAt` | [`Time!`](#time) | Date of creation. |
 | <a id="packagebaseid"></a>`id` | [`PackagesPackageID!`](#packagespackageid) | ID of the package. |
 | <a id="packagebasemetadata"></a>`metadata` | [`PackageMetadata`](#packagemetadata) | Package metadata. |
@@ -25773,7 +25768,6 @@ Represents a package details in the Package Registry.
 | Name | Type | Description |
 | ---- | ---- | ----------- |
 | <a id="packagedetailstype_links"></a>`_links` | [`PackageLinks!`](#packagelinks) | Map of links to perform actions on the package. |
-| <a id="packagedetailstypecandestroy"></a>`canDestroy` **{warning-solid}** | [`Boolean!`](#boolean) | **Deprecated** in GitLab 16.6. Superseded by `user_permissions` field. See `Types::PermissionTypes::Package` type. |
 | <a id="packagedetailstypecomposerconfigrepositoryurl"></a>`composerConfigRepositoryUrl` | [`String`](#string) | Url of the Composer setup endpoint. |
 | <a id="packagedetailstypecomposerurl"></a>`composerUrl` | [`String`](#string) | Url of the Composer endpoint. |
 | <a id="packagedetailstypeconanurl"></a>`conanUrl` | [`String`](#string) | Url of the Conan project endpoint. |
diff --git a/spec/fixtures/api/schemas/graphql/container_repository.json b/spec/fixtures/api/schemas/graphql/container_repository.json
index 95cc5e28b345130dbc60cb8bed0b2a6a48e84453..1fa7f17ab004b651e9f8aed08a4272b9a8d93716 100644
--- a/spec/fixtures/api/schemas/graphql/container_repository.json
+++ b/spec/fixtures/api/schemas/graphql/container_repository.json
@@ -8,7 +8,6 @@
     "createdAt",
     "updatedAt",
     "tagsCount",
-    "canDelete",
     "expirationPolicyCleanupStatus",
     "project",
     "lastCleanupDeletedTagsCount",
@@ -48,9 +47,6 @@
     "tagsCount": {
       "type": "integer"
     },
-    "canDelete": {
-      "type": "boolean"
-    },
     "expirationPolicyCleanupStatus": {
       "type": "string",
       "enum": [
diff --git a/spec/fixtures/api/schemas/graphql/container_repository_details.json b/spec/fixtures/api/schemas/graphql/container_repository_details.json
index dccdd85274d92f27d1597c058bb841593c6b7a7e..1b9c4493693b656b734f6a0ca838ea7197931b70 100644
--- a/spec/fixtures/api/schemas/graphql/container_repository_details.json
+++ b/spec/fixtures/api/schemas/graphql/container_repository_details.json
@@ -23,7 +23,6 @@
               "name",
               "path",
               "location",
-              "canDelete",
               "userPermissions"
             ],
             "properties": {
@@ -51,9 +50,6 @@
               "createdAt": {
                 "type": "string"
               },
-              "canDelete": {
-                "type": "boolean"
-              },
               "userPermissions": {
                 "type": "object",
                 "additionalProperties": false,
diff --git a/spec/fixtures/api/schemas/graphql/packages/package_details.json b/spec/fixtures/api/schemas/graphql/packages/package_details.json
index d01d75fcd46ddadf0aff5da7e080e1aca122d36f..5ab84cb2b351da5ae2896ba9b93c8c9af42c3d52 100644
--- a/spec/fixtures/api/schemas/graphql/packages/package_details.json
+++ b/spec/fixtures/api/schemas/graphql/packages/package_details.json
@@ -15,7 +15,6 @@
     "versions",
     "status",
     "statusMessage",
-    "canDestroy",
     "lastDownloadedAt",
     "_links",
     "userPermissions"
@@ -39,11 +38,6 @@
         "null"
       ]
     },
-    "canDestroy": {
-      "type": [
-        "boolean"
-      ]
-    },
     "packageType": {
       "type": [
         "string"
diff --git a/spec/graphql/types/container_repository_details_type_spec.rb b/spec/graphql/types/container_repository_details_type_spec.rb
index 75c2078a092776a45263028e331dcae7df6de1c3..61663f65b0e55814290e35b29998b8316f2d5750 100644
--- a/spec/graphql/types/container_repository_details_type_spec.rb
+++ b/spec/graphql/types/container_repository_details_type_spec.rb
@@ -2,9 +2,9 @@
 
 require 'spec_helper'
 
-RSpec.describe GitlabSchema.types['ContainerRepositoryDetails'] do
+RSpec.describe GitlabSchema.types['ContainerRepositoryDetails'], feature_category: :container_registry do
   fields = %i[id name path location created_at updated_at expiration_policy_started_at
-              status tags_count can_delete expiration_policy_cleanup_status tags size manifest
+              status tags_count expiration_policy_cleanup_status tags size manifest
               project migration_state last_cleanup_deleted_tags_count userPermissions]
 
   it { expect(described_class.graphql_name).to eq('ContainerRepositoryDetails') }
diff --git a/spec/graphql/types/container_repository_tag_type_spec.rb b/spec/graphql/types/container_repository_tag_type_spec.rb
index 4c91c39fcd6d04e8f6559abfdbd801af12d4cd8f..df623af6e51b9b1e22f5c6817b66e968dba31bac 100644
--- a/spec/graphql/types/container_repository_tag_type_spec.rb
+++ b/spec/graphql/types/container_repository_tag_type_spec.rb
@@ -4,7 +4,7 @@
 
 RSpec.describe GitlabSchema.types['ContainerRepositoryTag'], feature_category: :container_registry do
   fields = %i[name path location digest revision short_revision
-    total_size created_at can_delete user_permissions referrers published_at]
+    total_size created_at user_permissions referrers published_at]
 
   it { expect(described_class.graphql_name).to eq('ContainerRepositoryTag') }
 
diff --git a/spec/graphql/types/container_repository_type_spec.rb b/spec/graphql/types/container_repository_type_spec.rb
index 0c7879c3f2ab367f164f8d1e852e23e863c8b859..3d33ed4b6a521cfbf95c4e51dd89d5f5f3aa9f54 100644
--- a/spec/graphql/types/container_repository_type_spec.rb
+++ b/spec/graphql/types/container_repository_type_spec.rb
@@ -4,7 +4,7 @@
 
 RSpec.describe GitlabSchema.types['ContainerRepository'], feature_category: :container_registry do
   fields = %i[id name path location created_at updated_at expiration_policy_started_at
-              status tags_count can_delete expiration_policy_cleanup_status project
+              status tags_count expiration_policy_cleanup_status project
               migration_state last_cleanup_deleted_tags_count user_permissions]
 
   it { expect(described_class.graphql_name).to eq('ContainerRepository') }
diff --git a/spec/graphql/types/packages/package_base_type_spec.rb b/spec/graphql/types/packages/package_base_type_spec.rb
index 6b568f4ae7f51899f0f61f682c656ee8e77b5f55..c3319539639bd519c115379f3bba3dc4b49e3b61 100644
--- a/spec/graphql/types/packages/package_base_type_spec.rb
+++ b/spec/graphql/types/packages/package_base_type_spec.rb
@@ -13,7 +13,7 @@
       created_at updated_at
       project
       tags metadata
-      status status_message can_destroy
+      status status_message
       user_permissions
     ]
 
diff --git a/spec/graphql/types/packages/package_type_spec.rb b/spec/graphql/types/packages/package_type_spec.rb
index dc1cc6a8bada1113fd59be8bcd6a07e298b589c9..934e827cdbe0de872b219d2ec061ce543c2aa5a0 100644
--- a/spec/graphql/types/packages/package_type_spec.rb
+++ b/spec/graphql/types/packages/package_type_spec.rb
@@ -13,8 +13,7 @@
       created_at updated_at
       project
       tags pipelines metadata
-      status can_destroy
-      user_permissions
+      status user_permissions
     ]
 
     expect(described_class).to include_graphql_fields(*expected_fields)
diff --git a/spec/requests/api/graphql/container_repository/container_repository_details_spec.rb b/spec/requests/api/graphql/container_repository/container_repository_details_spec.rb
index 4d5579407b7c9e951f41e64fe3fce96b9b25db49..70e50554e14c58922a1a4248d0d72f7fb8faca4d 100644
--- a/spec/requests/api/graphql/container_repository/container_repository_details_spec.rb
+++ b/spec/requests/api/graphql/container_repository/container_repository_details_spec.rb
@@ -55,7 +55,9 @@
         <<~GQL
           query($id: ContainerRepositoryID!, $n: ContainerRepositoryTagSort) {
             containerRepository(id: $id) {
-              canDelete
+              userPermissions {
+                destroyContainerRepository
+              }
               tags(sort: $n) {
                 edges {
                   node {
@@ -68,7 +70,7 @@
         GQL
       end
 
-      where(:project_visibility, :role, :access_granted, :can_delete) do
+      where(:project_visibility, :role, :access_granted, :destroy_container_repository) do
         :private | :maintainer | true  | true
         :private | :developer  | true  | true
         :private | :reporter   | true  | false
@@ -92,7 +94,7 @@
 
           if access_granted
             expect(tags_response.size).to eq(repository_tags.size)
-            expect(container_repository_details_response.dig('canDelete')).to eq(can_delete)
+            expect(container_repository_details_response.dig('userPermissions', 'destroyContainerRepository')).to eq(destroy_container_repository)
           else
             expect(container_repository_details_response).to eq(nil)
           end
diff --git a/spec/requests/api/graphql/group/container_repositories_spec.rb b/spec/requests/api/graphql/group/container_repositories_spec.rb
index 9206ead153422fa30355c01e78fce7775250855e..5d9c5050add09367e0f7d07a9e0677ed8ae45df4 100644
--- a/spec/requests/api/graphql/group/container_repositories_spec.rb
+++ b/spec/requests/api/graphql/group/container_repositories_spec.rb
@@ -14,12 +14,12 @@
   let_it_be(:container_repositories) { [container_repository, container_repositories_delete_scheduled, container_repositories_delete_failed].flatten }
   let_it_be(:container_expiration_policy) { project.container_expiration_policy }
 
-  let(:excluded_fields) { [] }
+  let(:excluded_fields) { %w[pipeline jobs productAnalyticsState mlModels] }
   let(:container_repositories_fields) do
     <<~GQL
       edges {
         node {
-          #{all_graphql_fields_for('container_repositories'.classify, max_depth: 1, excluded: excluded_fields)}
+          #{all_graphql_fields_for('container_repositories'.classify, excluded: excluded_fields)}
         }
       }
     GQL
@@ -64,7 +64,7 @@
   context 'with different permissions' do
     let_it_be(:user) { create(:user) }
 
-    where(:group_visibility, :role, :access_granted, :can_delete) do
+    where(:group_visibility, :role, :access_granted, :destroy_container_repository) do
       :private | :maintainer | true   | true
       :private | :developer  | true   | true
       :private | :reporter   | true   | false
@@ -91,7 +91,7 @@
         if access_granted
           expect(container_repositories_response.size).to eq(container_repositories.size)
           container_repositories_response.each do |repository_response|
-            expect(repository_response.dig('node', 'canDelete')).to eq(can_delete)
+            expect(repository_response.dig('node', 'userPermissions', 'destroyContainerRepository')).to eq(destroy_container_repository)
           end
         else
           expect(container_repositories_response).to eq(nil)
@@ -156,7 +156,7 @@
   it_behaves_like 'handling graphql network errors with the container registry'
 
   it_behaves_like 'not hitting graphql network errors with the container registry' do
-    let(:excluded_fields) { %w[tags tagsCount] }
+    let(:excluded_fields) { %w[pipeline jobs tags tagsCount productAnalyticsState mlModels] }
   end
 
   it 'returns the total count of container repositories' do
diff --git a/spec/requests/api/graphql/project/container_repositories_spec.rb b/spec/requests/api/graphql/project/container_repositories_spec.rb
index 2307409c383c55e571e1baca04f23ed931b10f78..9a2d1c2317b2b8217e27f0506672dbd093000faa 100644
--- a/spec/requests/api/graphql/project/container_repositories_spec.rb
+++ b/spec/requests/api/graphql/project/container_repositories_spec.rb
@@ -65,7 +65,7 @@
   context 'with different permissions' do
     let_it_be(:user) { create(:user) }
 
-    where(:project_visibility, :role, :access_granted, :can_delete) do
+    where(:project_visibility, :role, :access_granted, :destroy_container_repository) do
       :private | :maintainer | true  | true
       :private | :developer  | true  | true
       :private | :reporter   | true  | false
@@ -90,7 +90,7 @@
         if access_granted
           expect(container_repositories_response.size).to eq(container_repositories.size)
           container_repositories_response.each do |repository_response|
-            expect(repository_response.dig('node', 'canDelete')).to eq(can_delete)
+            expect(repository_response.dig('node', 'userPermissions', 'destroyContainerRepository')).to eq(destroy_container_repository)
           end
         else
           expect(container_repositories_response).to eq(nil)