diff --git a/.build-tools/go.mod b/.build-tools/go.mod
index 3c03d97215..2b7fb65bfd 100644
--- a/.build-tools/go.mod
+++ b/.build-tools/go.mod
@@ -9,7 +9,6 @@ require (
 	github.com/invopop/jsonschema v0.6.0
 	github.com/spf13/cobra v1.6.1
 	github.com/xeipuuv/gojsonschema v1.2.1-0.20201027075954-b076d39a02e5
-	golang.org/x/exp v0.0.0-20231006140011-7918f672742d
 	gopkg.in/yaml.v3 v3.0.1
 	sigs.k8s.io/yaml v1.4.0
 )
diff --git a/.build-tools/go.sum b/.build-tools/go.sum
index d70b5cde34..ef43cfd472 100644
--- a/.build-tools/go.sum
+++ b/.build-tools/go.sum
@@ -45,8 +45,6 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHo
 github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
 github.com/xeipuuv/gojsonschema v1.2.1-0.20201027075954-b076d39a02e5 h1:ImnGIsrcG8vwbovhYvvSY8fagVV6QhCWSWXfzwGDLVs=
 github.com/xeipuuv/gojsonschema v1.2.1-0.20201027075954-b076d39a02e5/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
-golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI=
-golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
 gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
diff --git a/.build-tools/pkg/metadataschema/validators.go b/.build-tools/pkg/metadataschema/validators.go
index d0c9d5ba5c..eaa1042433 100644
--- a/.build-tools/pkg/metadataschema/validators.go
+++ b/.build-tools/pkg/metadataschema/validators.go
@@ -16,10 +16,9 @@ package metadataschema
 import (
 	"errors"
 	"fmt"
+	"slices"
 	"strings"
 
-	"golang.org/x/exp/slices"
-
 	mdutils "github.com/dapr/components-contrib/metadata"
 )
 
diff --git a/.golangci.yml b/.golangci.yml
index 63607f790d..fba2a967d2 100644
--- a/.golangci.yml
+++ b/.golangci.yml
@@ -131,6 +131,8 @@ linters-settings:
             desc: "must use context"
           - pkg: "github.com/pkg/errors"
             desc: "must use standard library (errors package and/or fmt.Errorf)"
+          - pkg: "golang.org/x/exp/slices"
+            desc: "must use slices from standard library"
           - pkg: "github.com/go-chi/chi$"
             desc: "must use github.com/go-chi/chi/v5"
           - pkg: "github.com/cenkalti/backoff$"
diff --git a/bindings/cloudflare/queues/cfqueues.go b/bindings/cloudflare/queues/cfqueues.go
index a9afab0e81..bf539e86f3 100644
--- a/bindings/cloudflare/queues/cfqueues.go
+++ b/bindings/cloudflare/queues/cfqueues.go
@@ -20,10 +20,9 @@ import (
 	"io"
 	"net/http"
 	"reflect"
+	"slices"
 	"strconv"
 
-	"golang.org/x/exp/slices"
-
 	"github.com/dapr/components-contrib/bindings"
 	"github.com/dapr/components-contrib/common/component/cloudflare/workers"
 	contribMetadata "github.com/dapr/components-contrib/metadata"
diff --git a/common/features/feature.go b/common/features/feature.go
new file mode 100644
index 0000000000..c286f73e33
--- /dev/null
+++ b/common/features/feature.go
@@ -0,0 +1,26 @@
+/*
+Copyright 2023 The Dapr Authors
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package features
+
+import (
+	"slices"
+)
+
+// Feature is a generic type for features supported by components.
+type Feature[T any] string
+
+// IsPresent checks if a given feature is present in the list.
+func (f Feature[T]) IsPresent(features []Feature[T]) bool {
+	return slices.Contains(features, f)
+}
diff --git a/configuration/postgres/postgres.go b/configuration/postgres/postgres.go
index f5cef79234..8188591895 100644
--- a/configuration/postgres/postgres.go
+++ b/configuration/postgres/postgres.go
@@ -20,6 +20,7 @@ import (
 	"fmt"
 	"reflect"
 	"regexp"
+	"slices"
 	"strconv"
 	"strings"
 	"sync"
@@ -28,7 +29,6 @@ import (
 	"github.com/jackc/pgx/v5"
 	"github.com/jackc/pgx/v5/pgconn"
 	"github.com/jackc/pgx/v5/pgxpool"
-	"golang.org/x/exp/slices"
 
 	"github.com/dapr/components-contrib/configuration"
 	contribMetadata "github.com/dapr/components-contrib/metadata"
diff --git a/crypto/feature.go b/crypto/feature.go
index 7440cbf8ac..ee15954785 100644
--- a/crypto/feature.go
+++ b/crypto/feature.go
@@ -14,13 +14,8 @@ limitations under the License.
 package crypto
 
 import (
-	"golang.org/x/exp/slices"
+	"github.com/dapr/components-contrib/common/features"
 )
 
 // Feature names a feature that can be implemented by the crypto provider components.
-type Feature string
-
-// IsPresent checks if a given feature is present in the list.
-func (f Feature) IsPresent(features []Feature) bool {
-	return slices.Contains(features, f)
-}
+type Feature = features.Feature[SubtleCrypto]
diff --git a/crypto/key.go b/crypto/key.go
index 2a2f3cba30..e08ecdafdf 100644
--- a/crypto/key.go
+++ b/crypto/key.go
@@ -15,10 +15,10 @@ package crypto
 
 import (
 	"encoding/json"
+	"slices"
 	"time"
 
 	"github.com/lestrrat-go/jwx/v2/jwk"
-	"golang.org/x/exp/slices"
 )
 
 // Key extends jwk.Key adding optional properties for determining if the key is valid (time bounds) or can be used for certain purposes.
diff --git a/middleware/http/opa/middleware.go b/middleware/http/opa/middleware.go
index cf6a2fade3..6346c23ec2 100644
--- a/middleware/http/opa/middleware.go
+++ b/middleware/http/opa/middleware.go
@@ -24,12 +24,12 @@ import (
 	"net/http"
 	"net/textproto"
 	"reflect"
+	"slices"
 	"strconv"
 	"strings"
 	"time"
 
 	"github.com/open-policy-agent/opa/rego"
-	"golang.org/x/exp/slices"
 
 	"github.com/dapr/components-contrib/common/httputils"
 	contribMetadata "github.com/dapr/components-contrib/metadata"
diff --git a/pubsub/feature.go b/pubsub/feature.go
index f4b279573c..267a6734db 100644
--- a/pubsub/feature.go
+++ b/pubsub/feature.go
@@ -14,7 +14,7 @@ limitations under the License.
 package pubsub
 
 import (
-	"golang.org/x/exp/slices"
+	"github.com/dapr/components-contrib/common/features"
 )
 
 const (
@@ -26,9 +26,4 @@ const (
 )
 
 // Feature names a feature that can be implemented by PubSub components.
-type Feature string
-
-// IsPresent checks if a given feature is present in the list.
-func (f Feature) IsPresent(features []Feature) bool {
-	return slices.Contains(features, f)
-}
+type Feature = features.Feature[PubSub]
diff --git a/secretstores/feature.go b/secretstores/feature.go
index e3f80e8bd5..ee1f7a47da 100644
--- a/secretstores/feature.go
+++ b/secretstores/feature.go
@@ -14,18 +14,12 @@ limitations under the License.
 package secretstores
 
 import (
-	"golang.org/x/exp/slices"
+	"github.com/dapr/components-contrib/common/features"
 )
 
-// Feature names a feature that can be implemented by Secret Store components.
-type Feature string
-
 const (
 	// FeatureMultipleKeyValuesPerSecret advertises that this SecretStore supports multiple keys-values under a single secret.
 	FeatureMultipleKeyValuesPerSecret Feature = "MULTIPLE_KEY_VALUES_PER_SECRET"
 )
 
-// IsPresent checks if a given feature is present in the list.
-func (f Feature) IsPresent(features []Feature) bool {
-	return slices.Contains(features, f)
-}
+type Feature = features.Feature[SecretStore]
diff --git a/state/cloudflare/workerskv/workerskv.go b/state/cloudflare/workerskv/workerskv.go
index b3a698c33f..a3a2b63ce9 100644
--- a/state/cloudflare/workerskv/workerskv.go
+++ b/state/cloudflare/workerskv/workerskv.go
@@ -23,10 +23,10 @@ import (
 	"net/http"
 	"net/url"
 	"reflect"
+	"slices"
 	"strconv"
 
 	"github.com/mitchellh/mapstructure"
-	"golang.org/x/exp/slices"
 
 	"github.com/dapr/components-contrib/common/component/cloudflare/workers"
 	"github.com/dapr/components-contrib/metadata"
diff --git a/state/feature.go b/state/feature.go
index 6cb38ec8ae..5985dff612 100644
--- a/state/feature.go
+++ b/state/feature.go
@@ -14,7 +14,7 @@ limitations under the License.
 package state
 
 import (
-	"golang.org/x/exp/slices"
+	"github.com/dapr/components-contrib/common/features"
 )
 
 const (
@@ -31,9 +31,4 @@ const (
 )
 
 // Feature names a feature that can be implemented by state store components.
-type Feature string
-
-// IsPresent checks if a given feature is present in the list.
-func (f Feature) IsPresent(features []Feature) bool {
-	return slices.Contains(features, f)
-}
+type Feature = features.Feature[BaseStore]
diff --git a/tests/certification/go.mod b/tests/certification/go.mod
index 1dba9b43c1..42d585754b 100644
--- a/tests/certification/go.mod
+++ b/tests/certification/go.mod
@@ -37,7 +37,6 @@ require (
 	go.mongodb.org/mongo-driver v1.12.1
 	go.uber.org/multierr v1.11.0
 	go.uber.org/ratelimit v0.3.0
-	golang.org/x/exp v0.0.0-20231006140011-7918f672742d
 	k8s.io/utils v0.0.0-20230726121419-3b25d923346b
 	modernc.org/sqlite v1.27.0
 )
@@ -298,6 +297,7 @@ require (
 	go.uber.org/zap v1.24.0 // indirect
 	golang.org/x/arch v0.3.0 // indirect
 	golang.org/x/crypto v0.14.0 // indirect
+	golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect
 	golang.org/x/mod v0.13.0 // indirect
 	golang.org/x/net v0.17.0 // indirect
 	golang.org/x/oauth2 v0.13.0 // indirect
diff --git a/tests/certification/middleware/http/bearer/bearer_test.go b/tests/certification/middleware/http/bearer/bearer_test.go
index 3b20628e15..024e5e1ade 100644
--- a/tests/certification/middleware/http/bearer/bearer_test.go
+++ b/tests/certification/middleware/http/bearer/bearer_test.go
@@ -21,6 +21,7 @@ import (
 	"fmt"
 	"io"
 	"net/http"
+	"slices"
 	"strconv"
 	"sync/atomic"
 	"testing"
@@ -32,7 +33,6 @@ import (
 	"github.com/lestrrat-go/jwx/v2/jwt"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
-	"golang.org/x/exp/slices"
 
 	// Import the embed package.
 	_ "embed"
diff --git a/tests/certification/state/azure/cosmosdb/cosmosdb_test.go b/tests/certification/state/azure/cosmosdb/cosmosdb_test.go
index 95afb6bdc8..81cb1a097c 100644
--- a/tests/certification/state/azure/cosmosdb/cosmosdb_test.go
+++ b/tests/certification/state/azure/cosmosdb/cosmosdb_test.go
@@ -15,6 +15,7 @@ package cosmosDBStorage_test
 
 import (
 	"os"
+	"slices"
 	"strconv"
 	"strings"
 	"testing"
@@ -22,7 +23,6 @@ import (
 	"github.com/google/uuid"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
-	"golang.org/x/exp/slices"
 
 	"github.com/dapr/components-contrib/metadata"
 	secretstore_env "github.com/dapr/components-contrib/secretstores/local/env"
diff --git a/tests/conformance/crypto/crypto.go b/tests/conformance/crypto/crypto.go
index 70cd5d5046..d75aa7d2ee 100644
--- a/tests/conformance/crypto/crypto.go
+++ b/tests/conformance/crypto/crypto.go
@@ -17,6 +17,7 @@ import (
 	"bytes"
 	"context"
 	"encoding/json"
+	"slices"
 	"strings"
 	"testing"
 	"time"
@@ -24,7 +25,6 @@ import (
 	"github.com/lestrrat-go/jwx/v2/jwk"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
-	"golang.org/x/exp/slices"
 
 	contribCrypto "github.com/dapr/components-contrib/crypto"
 	"github.com/dapr/components-contrib/metadata"
diff --git a/tests/conformance/crypto/helpers.go b/tests/conformance/crypto/helpers.go
index f84beccc03..42a3e0dc56 100644
--- a/tests/conformance/crypto/helpers.go
+++ b/tests/conformance/crypto/helpers.go
@@ -23,12 +23,12 @@ import (
 	"hash"
 	"io"
 	"log"
+	"slices"
 	"strings"
 	"testing"
 
 	"github.com/lestrrat-go/jwx/v2/jwk"
 	"github.com/stretchr/testify/require"
-	"golang.org/x/exp/slices"
 )
 
 type keybag struct {
diff --git a/tests/conformance/pubsub/pubsub.go b/tests/conformance/pubsub/pubsub.go
index 932b417021..55f54ed968 100644
--- a/tests/conformance/pubsub/pubsub.go
+++ b/tests/conformance/pubsub/pubsub.go
@@ -18,6 +18,7 @@ import (
 	"errors"
 	"fmt"
 	"reflect"
+	"slices"
 	"sort"
 	"strconv"
 	"strings"
@@ -28,7 +29,6 @@ import (
 	"github.com/google/uuid"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
-	"golang.org/x/exp/slices"
 
 	"github.com/dapr/components-contrib/metadata"
 	"github.com/dapr/components-contrib/pubsub"
diff --git a/tests/conformance/state/state.go b/tests/conformance/state/state.go
index f038f704b1..fab6693d2d 100644
--- a/tests/conformance/state/state.go
+++ b/tests/conformance/state/state.go
@@ -17,6 +17,7 @@ import (
 	"context"
 	"encoding/json"
 	"fmt"
+	"slices"
 	"sort"
 	"strconv"
 	"strings"
@@ -26,7 +27,6 @@ import (
 	"github.com/google/uuid"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
-	"golang.org/x/exp/slices"
 
 	"github.com/dapr/components-contrib/contenttype"
 	"github.com/dapr/components-contrib/metadata"
diff --git a/tests/e2e/pubsub/jetstream/go.mod b/tests/e2e/pubsub/jetstream/go.mod
index 034155c2a9..ff384670b0 100644
--- a/tests/e2e/pubsub/jetstream/go.mod
+++ b/tests/e2e/pubsub/jetstream/go.mod
@@ -27,7 +27,6 @@ require (
 	github.com/sirupsen/logrus v1.9.3 // indirect
 	github.com/spf13/cast v1.5.1 // indirect
 	golang.org/x/crypto v0.14.0 // indirect
-	golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect
 	golang.org/x/sys v0.13.0 // indirect
 	google.golang.org/protobuf v1.31.0 // indirect
 	gopkg.in/inf.v0 v0.9.1 // indirect