You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pekko.apache.org by he...@apache.org on 2026/06/06 09:33:18 UTC

(pekko) branch scalaNewFmt updated: chore: Rewrite to scala3 syntax

This is an automated email from the ASF dual-hosted git repository.

He-Pin pushed a commit to branch scalaNewFmt
in repository https://gitbox.apache.org/repos/asf/pekko.git


The following commit(s) were added to refs/heads/scalaNewFmt by this push:
     new ed8a7f23db chore: Rewrite  to scala3 syntax
ed8a7f23db is described below

commit ed8a7f23db30f7a03a368774aa4f19fdc79f4e2a
Author: He-Pin <he...@gmail.com>
AuthorDate: Sat Jun 6 17:20:55 2026 +0800

    chore: Rewrite  to scala3 syntax
---
 .scalafmt.conf                                     |  12 +-
 .../apache/pekko/actor/testkit/typed/Effect.scala  |  18 +--
 .../actor/testkit/typed/TestKitSettings.scala      |  10 +-
 .../testkit/typed/internal/ActorSystemStub.scala   |   2 +-
 .../typed/internal/LoggingTestKitImpl.scala        |  10 +-
 .../typed/internal/StubbedActorContext.scala       |   4 +-
 .../testkit/typed/internal/TestKitUtils.scala      |   4 +-
 .../testkit/typed/internal/TestProbeImpl.scala     |   2 +-
 .../actor/testkit/typed/javadsl/ActorTestKit.scala |   8 +-
 .../typed/javadsl/JUnit5TestKitBuilder.scala       |   4 +-
 .../typed/javadsl/JUnitJupiterTestKitBuilder.scala |   4 +-
 .../testkit/typed/javadsl/LoggingTestKit.scala     |   6 +-
 .../actor/testkit/typed/javadsl/ManualTime.scala   |   2 +-
 .../typed/javadsl/SerializationTestKit.scala       |   2 +-
 .../typed/javadsl/TestKitJunitResource.scala       |   2 +-
 .../actor/testkit/typed/javadsl/TestProbe.scala    |   8 +-
 .../testkit/typed/scaladsl/ActorTestKit.scala      |   8 +-
 .../testkit/typed/scaladsl/LoggingTestKit.scala    |   2 +-
 .../actor/testkit/typed/scaladsl/ManualTime.scala  |   4 +-
 .../typed/scaladsl/ScalaTestWithActorTestKit.scala |   2 +-
 .../typed/scaladsl/SerializationTestKit.scala      |   2 +-
 .../actor/testkit/typed/scaladsl/TestProbe.scala   |   4 +-
 .../typed/scaladsl/SyncTestingExampleSpec.scala    |   4 +-
 .../testkit/typed/scaladsl/ActorTestKitSpec.scala  |   4 +-
 .../typed/scaladsl/BehaviorTestKitSpec.scala       |   6 +-
 .../org/apache/pekko/util/LineNumberSpec.scala     |   4 +-
 .../org/apache/pekko/PekkoExceptionSpec.scala      |   2 +-
 .../actor/AbstractActorPreRestartFinalSpec.scala   |   6 +-
 .../org/apache/pekko/actor/ActorMailboxSpec.scala  |   2 +-
 .../org/apache/pekko/actor/DynamicAccessSpec.scala |   2 +-
 .../org/apache/pekko/actor/ExtensionSpec.scala     |   2 +-
 .../pekko/actor/SupervisorHierarchySpec.scala      |   4 +-
 .../apache/pekko/dispatch/MailboxConfigSpec.scala  |   2 +-
 .../org/apache/pekko/pattern/StatusReplySpec.scala |   2 +-
 .../serialization/SerializationSetupSpec.scala     |   2 +-
 .../apache/pekko/serialization/SerializeSpec.scala |  10 +-
 .../pekko/util/BoundedBlockingQueueSpec.scala      |   2 +-
 .../pekko/util/ByteStringInitializationSpec.scala  |   2 +-
 .../org/apache/pekko/util/ByteStringSpec.scala     |   2 +-
 .../org/apache/pekko/util/WildcardIndexSpec.scala  |   6 +-
 .../pekko/typed/InteractionPatterns3Spec.scala     |  22 +--
 .../pekko/typed/InteractionPatternsSpec.scala      |   4 +-
 .../apache/pekko/typed/LoggingDocExamples.scala    |   4 +-
 .../apache/pekko/typed/StyleGuideDocExamples.scala |   2 +-
 .../pekko/typed/extensions/ExtensionDocSpec.scala  |   6 +-
 .../org/apache/pekko/actor/typed/AskSpec.scala     |   2 +-
 .../apache/pekko/actor/typed/ExtensionsSpec.scala  |  20 +--
 .../LocalActorRefProviderLogMessagesSpec.scala     |   8 +-
 .../pekko/actor/typed/MailboxSelectorSpec.scala    |   2 +-
 .../apache/pekko/actor/typed/SupervisionSpec.scala |   6 +-
 .../delivery/DurableProducerControllerSpec.scala   |   4 +-
 .../typed/delivery/DurableWorkPullingSpec.scala    |   4 +-
 .../delivery/ReliableDeliveryRandomSpec.scala      |   4 +-
 .../actor/typed/internal/ActorSystemSpec.scala     |   2 +-
 .../receptionist/LocalReceptionistSpec.scala       |   2 +-
 .../actor/typed/scaladsl/MailboxSelectorSpec.scala |   4 +-
 .../org/apache/pekko/actor/typed/ActorRef.scala    |   2 +-
 .../pekko/actor/typed/ActorRefResolver.scala       |  10 +-
 .../pekko/actor/typed/BehaviorInterceptor.scala    |   8 +-
 .../org/apache/pekko/actor/typed/Extensions.scala  |  10 +-
 .../actor/typed/delivery/ConsumerController.scala  |   4 +-
 .../typed/delivery/DurableProducerQueue.scala      |   4 +-
 .../actor/typed/delivery/ProducerController.scala  |   4 +-
 .../delivery/WorkPullingProducerController.scala   |   4 +-
 .../delivery/internal/ConsumerControllerImpl.scala |  18 +--
 .../delivery/internal/ProducerControllerImpl.scala |   4 +-
 .../actor/typed/eventstream/EventStream.scala      |   2 +-
 .../actor/typed/internal/ActorContextImpl.scala    |  14 +-
 .../actor/typed/internal/ActorFlightRecorder.scala |   2 +-
 .../pekko/actor/typed/internal/ActorRefImpl.scala  |   4 +-
 .../typed/internal/EventStreamExtension.scala      |   4 +-
 .../actor/typed/internal/ExtensionsImpl.scala      |  12 +-
 .../actor/typed/internal/InterceptorImpl.scala     |  10 +-
 .../pekko/actor/typed/internal/LoggerClass.scala   |  10 +-
 .../typed/internal/MiscMessageSerializer.scala     |   4 +-
 .../pekko/actor/typed/internal/PoisonPill.scala    |   2 +-
 .../pekko/actor/typed/internal/Supervision.scala   |  18 +--
 .../internal/WithMdcBehaviorInterceptor.scala      |   4 +-
 .../typed/internal/adapter/ActorAdapter.scala      |   8 +-
 .../internal/adapter/ActorContextAdapter.scala     |   8 +-
 .../typed/internal/adapter/ActorRefAdapter.scala   |   4 +-
 .../internal/adapter/ActorSystemAdapter.scala      |  10 +-
 .../typed/internal/adapter/PropsAdapter.scala      |   2 +-
 .../internal/receptionist/LocalReceptionist.scala  |   8 +-
 .../internal/receptionist/ReceptionistImpl.scala   |   2 +-
 .../receptionist/ReceptionistMessages.scala        |   6 +-
 .../receptionist/ServiceKeySerializer.scala        |   4 +-
 .../typed/internal/routing/GroupRouterImpl.scala   |   2 +-
 .../typed/internal/routing/PoolRouterImpl.scala    |   2 +-
 .../pekko/actor/typed/javadsl/ActorContext.scala   |   2 +-
 .../apache/pekko/actor/typed/javadsl/Adapter.scala |  18 +--
 .../actor/typed/javadsl/BehaviorBuilder.scala      |   4 +-
 .../pekko/actor/typed/javadsl/ReceiveBuilder.scala |   4 +-
 .../actor/typed/receptionist/Receptionist.scala    |  26 ++--
 .../pekko/actor/typed/scaladsl/ActorContext.scala  |   2 +-
 .../pekko/actor/typed/scaladsl/AskPattern.scala    |   4 +-
 .../actor/typed/scaladsl/adapter/package.scala     |   8 +-
 .../org/apache/pekko/util/ByteIterator.scala       | 123 ++++++++--------
 .../org/apache/pekko/actor/AbstractProps.scala     |  10 +-
 .../scala/org/apache/pekko/actor/ActorCell.scala   |   2 +-
 .../scala/org/apache/pekko/actor/ActorSystem.scala |   8 +-
 .../apache/pekko/actor/CoordinatedShutdown.scala   |   2 +-
 .../scala/org/apache/pekko/actor/Deployer.scala    |   2 +-
 .../org/apache/pekko/actor/DynamicAccess.scala     |   6 +-
 .../scala/org/apache/pekko/actor/Extension.scala   |   2 +-
 .../main/scala/org/apache/pekko/actor/FSM.scala    |   4 +-
 .../org/apache/pekko/actor/FaultHandling.scala     |  16 +--
 .../apache/pekko/actor/IndirectActorProducer.scala |  16 +--
 .../main/scala/org/apache/pekko/actor/Props.scala  |  12 +-
 .../pekko/actor/ReflectiveDynamicAccess.scala      |  10 +-
 .../pekko/actor/dungeon/ChildrenContainer.scala    |   4 +-
 .../org/apache/pekko/actor/dungeon/Dispatch.scala  |   2 +-
 .../pekko/actor/setup/ActorSystemSetup.scala       |   2 +-
 .../apache/pekko/dispatch/CompletionStages.scala   |  18 +--
 .../dispatch/ForkJoinExecutorConfigurator.scala    |   2 +-
 .../org/apache/pekko/dispatch/Mailboxes.scala      |  26 ++--
 .../apache/pekko/dispatch/ThreadPoolBuilder.scala  |   8 +-
 .../dispatch/VirtualizedExecutorService.scala      |  10 +-
 .../scala/org/apache/pekko/event/EventStream.scala |  14 +-
 .../scala/org/apache/pekko/event/Logging.scala     | 154 ++++++++++-----------
 .../scala/org/apache/pekko/io/DnsProvider.scala    |   4 +-
 .../main/scala/org/apache/pekko/japi/JavaAPI.scala |   4 +-
 .../org/apache/pekko/pattern/CircuitBreaker.scala  |   6 +-
 .../pekko/pattern/CircuitBreakersRegistry.scala    |   2 +-
 .../org/apache/pekko/pattern/StatusReply.scala     |   4 +-
 .../pekko/serialization/PrimitiveSerializers.scala |  10 +-
 .../apache/pekko/serialization/Serialization.scala |  28 ++--
 .../pekko/serialization/SerializationSetup.scala   |   6 +-
 .../apache/pekko/serialization/Serializer.scala    |  20 +--
 .../apache/pekko/util/BoundedBlockingQueue.scala   |  14 +-
 .../scala/org/apache/pekko/util/BoxedType.scala    |   4 +-
 .../pekko/util/ClassLoaderObjectInputStream.scala  |   2 +-
 .../scala/org/apache/pekko/util/LineNumbers.scala  |   2 +-
 .../main/scala/org/apache/pekko/util/Reflect.scala |  20 +--
 .../org/apache/pekko/util/TypedMultiMap.scala      |   2 +-
 .../pekko/actor/typed/TypedBenchmarkActors.scala   |   2 +-
 .../pekko/remote/artery/CodecBenchmark.scala       |   2 +-
 .../ActorGraphInterpreterBoundaryBenchmark.scala   |   2 +-
 .../org/apache/pekko/stream/FlowMapBenchmark.scala |   2 +-
 .../metrics/protobuf/NumberInputStream.scala       |   2 +-
 .../sharding/typed/ClusterShardingQuery.scala      |   8 +-
 .../sharding/typed/ClusterShardingSettings.scala   |   4 +-
 .../typed/ReplicatedShardingExtension.scala        |   4 +-
 .../typed/ShardedDaemonProcessSettings.scala       |   4 +-
 .../delivery/ShardingConsumerController.scala      |   4 +-
 .../delivery/ShardingProducerController.scala      |   4 +-
 .../internal/ShardingConsumerControllerImpl.scala  |   2 +-
 .../typed/internal/ClusterShardingImpl.scala       |  12 +-
 .../internal/ReplicatedShardingExtensionImpl.scala |   2 +-
 .../internal/ShardedDaemonProcessCoordinator.scala |   2 +-
 .../typed/internal/ShardedDaemonProcessImpl.scala  |   2 +-
 .../typed/internal/ShardingSerializer.scala        |   6 +-
 .../typed/internal/testkit/TestEntityRefImpl.scala |   4 +-
 .../sharding/typed/javadsl/ClusterSharding.scala   |   2 +-
 .../typed/javadsl/ShardedDaemonProcess.scala       |   2 +-
 .../sharding/typed/scaladsl/ClusterSharding.scala  |   6 +-
 .../typed/scaladsl/ShardedDaemonProcess.scala      |   2 +-
 ...urableStateStoreQueryUsageCompileOnlySpec.scala |   2 +-
 .../ExternalShardAllocationCompileOnlySpec.scala   |   2 +-
 .../typed/HelloWorldPersistentEntityExample.scala  |   2 +-
 .../typed/ReplicatedShardingCompileOnlySpec.scala  |   2 +-
 ...oinConfigCompatCheckerClusterShardingSpec.scala |   4 +-
 .../sharding/typed/ReplicatedShardingSpec.scala    |   2 +-
 .../typed/delivery/DurableShardingSpec.scala       |   8 +-
 .../scaladsl/ClusterShardingPersistenceSpec.scala  |   2 +-
 .../cluster/sharding/ShardingFlightRecorder.scala  |   2 +-
 .../sharding/MultiNodeClusterShardingConfig.scala  |   2 +-
 .../cluster/sharding/ShardingQueriesSpec.scala     |   6 +-
 .../ddata/typed/internal/ReplicatorBehavior.scala  |  16 +--
 .../ddata/typed/javadsl/DistributedData.scala      |  10 +-
 .../ddata/typed/javadsl/ReplicatorSettings.scala   |   2 +-
 .../ddata/typed/scaladsl/DistributedData.scala     |   6 +-
 .../ddata/typed/scaladsl/ReplicatorSettings.scala  |   4 +-
 .../org/apache/pekko/cluster/typed/Cluster.scala   |   8 +-
 .../pekko/cluster/typed/ClusterSingleton.scala     |  16 +--
 .../typed/internal/AdaptedClusterImpl.scala        |   4 +-
 .../internal/AdaptedClusterSingletonImpl.scala     |  10 +-
 .../internal/PekkoClusterTypedSerializer.scala     |   8 +-
 .../delivery/ReliableDeliverySerializer.scala      |  26 ++--
 .../receptionist/ClusterReceptionist.scala         |  20 +--
 .../receptionist/ClusterReceptionistSettings.scala |   2 +-
 .../typed/internal/receptionist/Registry.scala     |  12 +-
 .../cluster/typed/BasicClusterExampleSpec.scala    |  10 +-
 .../cluster/typed/DistributedPubSubExample.scala   |   6 +-
 .../pekko/cluster/typed/GroupRouterSpec.scala      |   8 +-
 .../scala/org/apache/pekko/cluster/Cluster.scala   |   6 +-
 .../org/apache/pekko/cluster/ClusterDaemon.scala   |   4 +-
 .../org/apache/pekko/cluster/ClusterEvent.scala    |   4 +-
 .../cluster/SurviveNetworkInstabilitySpec.scala    |   2 +-
 .../lease/scaladsl/LeaseProvider.scala             |   2 +-
 .../org/apache/pekko/cluster/ddata/GSet.scala      |   8 +-
 .../scala/org/apache/pekko/cluster/ddata/Key.scala |   4 +-
 .../org/apache/pekko/cluster/ddata/LWWMap.scala    |   2 +-
 .../apache/pekko/cluster/ddata/LWWRegister.scala   |   2 +-
 .../org/apache/pekko/cluster/ddata/ORMap.scala     |  38 ++---
 .../apache/pekko/cluster/ddata/ORMultiMap.scala    |   2 +-
 .../org/apache/pekko/cluster/ddata/ORSet.scala     |  28 ++--
 .../apache/pekko/cluster/ddata/PNCounterMap.scala  |   2 +-
 .../apache/pekko/cluster/ddata/Replicator.scala    |   4 +-
 .../ddata/protobuf/ReplicatedDataSerializer.scala  | 134 +++++++++---------
 .../protobuf/ReplicatorMessageSerializer.scala     |  56 ++++----
 .../cluster/ddata/JepsenInspiredInsertSpec.scala   |  16 +--
 .../pekko/cluster/ddata/ReplicatorChaosSpec.scala  |   6 +-
 .../pekko/cluster/ddata/ReplicatorDeltaSpec.scala  |  24 ++--
 .../pekko/cluster/ddata/ReplicatorGossipSpec.scala |   4 +-
 .../cluster/ddata/ReplicatorORSetDeltaSpec.scala   |   2 +-
 .../pekko/cluster/ddata/ReplicatorSpec.scala       |  10 +-
 .../cluster/ddata/WildcardSubscribeSpec.scala      |  20 +--
 .../pekko/cluster/ddata/LocalConcurrencySpec.scala |   2 +-
 .../apache/pekko/cluster/ddata/LotsOfDataBot.scala |   2 +-
 .../ddata/ReplicatorWildcardSubscriptionSpec.scala |  12 +-
 .../docs/actor/SharedMutableStateDocSpec.scala     |   2 +-
 .../scala/docs/ddata/DistributedDataDocSpec.scala  |  10 +-
 docs/src/test/scala/docs/ddata/ShoppingCart.scala  |   4 +-
 .../ddata/protobuf/TwoPhaseSetSerializer.scala     |   4 +-
 .../ddata/protobuf/TwoPhaseSetSerializer2.scala    |   2 +-
 .../src/test/scala/docs/event/LoggingDocSpec.scala |   2 +-
 docs/src/test/scala/docs/io/EchoServer.scala       |   2 +-
 .../persistence/PersistenceSerializerDocSpec.scala |   4 +-
 .../docs/serialization/SerializationDocSpec.scala  |   2 +-
 .../test/scala/docs/stream/GraphDSLDocSpec.scala   |   4 +-
 .../docs/stream/cookbook/RecipeAdhocSource.scala   |   2 +-
 .../stream/operators/JavaCollectorDocExample.scala |   2 +-
 .../scala/docs/stream/operators/source/Zip.scala   |   2 +-
 .../docs/stream/operators/sourceorflow/Limit.scala |   2 +-
 .../operators/sourceorflow/LimitWeighted.scala     |   2 +-
 .../apache/pekko/remote/testconductor/Player.scala |   4 +-
 .../pekko/remote/testkit/MultiNodeSpec.scala       |   4 +-
 .../apache/pekko/osgi/ActorSystemActivator.scala   |   4 +-
 .../pekko/osgi/BundleDelegatingClassLoader.scala   |   4 +-
 .../org/apache/pekko/osgi/PojoSRTestSupport.scala  |   2 +-
 .../query/internal/QuerySerializer.scala           |   4 +-
 .../journal/leveldb/AllPersistenceIdsStage.scala   |   2 +-
 .../leveldb/EventsByPersistenceIdStage.scala       |   2 +-
 .../query/journal/leveldb/EventsByTagStage.scala   |   2 +-
 .../persistence/query/typed/EventEnvelope.scala    |   2 +-
 .../persistence/serialization/SerializerSpec.scala |   4 +-
 .../internal/EventSourcedBehaviorTestKitImpl.scala |   6 +-
 .../testkit/internal/PersistenceProbeImpl.scala    |  10 +-
 .../SnapshotStorageEmulatorExtension.scala         |   2 +-
 .../javadsl/EventSourcedBehaviorTestKit.scala      |   4 +-
 .../testkit/javadsl/PersistenceTestKit.scala       |   2 +-
 .../testkit/javadsl/SnapshotTestKit.scala          |   2 +-
 .../scaladsl/EventSourcedBehaviorTestKit.scala     |   4 +-
 .../testkit/scaladsl/PersistenceTestKit.scala      |   2 +-
 .../persistence/testkit/scaladsl/TestOps.scala     |  10 +-
 .../ReplicatedEventSourcingCompileOnlySpec.scala   |   4 +-
 .../scaladsl/EventSourcedBehaviorReplySpec.scala   |   8 +-
 .../typed/scaladsl/EventSourcedBehaviorSpec.scala  |  16 +--
 .../scaladsl/EventSourcedBehaviorStashSpec.scala   |  12 +-
 .../scaladsl/EventSourcedBehaviorWatchSpec.scala   |   4 +-
 .../scaladsl/DurableStateBehaviorReplySpec.scala   |   6 +-
 .../DurableStateBehaviorStashOverflowSpec.scala    |   4 +-
 .../pekko/persistence/typed/crdt/ORSet.scala       |   2 +-
 .../typed/delivery/EventSourcedProducerQueue.scala |   8 +-
 .../typed/internal/EventSourcedBehaviorImpl.scala  |   8 +-
 .../typed/internal/EventSourcedSettings.scala      |   4 +-
 .../typed/internal/ExternalInteractions.scala      |   8 +-
 .../typed/internal/ReplayingEvents.scala           |   8 +-
 .../typed/internal/ReplayingSnapshot.scala         |   4 +-
 .../typed/internal/RequestingRecoveryPermit.scala  |   2 +-
 .../pekko/persistence/typed/internal/Running.scala |  14 +-
 .../typed/javadsl/EventSourcedBehavior.scala       |   4 +-
 .../typed/scaladsl/EventSourcedBehavior.scala      |  14 +-
 .../ReplicatedEventSourcingSerializer.scala        |  28 ++--
 .../state/internal/DurableStateBehaviorImpl.scala  |   6 +-
 .../state/internal/DurableStateSettings.scala      |   2 +-
 .../internal/DurableStateStoreInteractions.scala   |   2 +-
 .../typed/state/internal/Recovering.scala          |   6 +-
 .../state/internal/RequestingRecoveryPermit.scala  |   2 +-
 .../persistence/typed/state/internal/Running.scala |  12 +-
 .../typed/state/javadsl/DurableStateBehavior.scala |   2 +-
 .../state/scaladsl/DurableStateBehavior.scala      |  12 +-
 ...DurableStatePersistentBehaviorCompileOnly.scala |  24 ++--
 .../typed/StashingWhenSnapshottingSpec.scala       |   2 +-
 .../typed/internal/StashStateSpec.scala            |   2 +-
 .../scaladsl/PersistentActorCompileOnlyTest.scala  |   2 +-
 .../org/apache/pekko/persistence/TraitOrder.scala  |   2 +-
 .../org/apache/pekko/persistence/TraitOrder.scala  |   2 +-
 .../pekko/persistence/PersistencePlugin.scala      |   4 +-
 .../pekko/persistence/journal/EventAdapters.scala  |  18 +--
 .../journal/PersistencePluginProxy.scala           |   2 +-
 .../serialization/MessageSerializer.scala          |   2 +-
 .../serialization/SnapshotSerializer.scala         |   2 +-
 .../state/DurableStateStoreRegistry.scala          |  14 +-
 .../persistence/AtLeastOnceDeliverySpec.scala      |   2 +-
 .../pekko/persistence/PersistentActorSpec.scala    |   2 +-
 .../SnapshotRecoveryWithEmptyJournalSpec.scala     |   2 +-
 .../persistence/SnapshotSerializationSpec.scala    |   2 +-
 .../apache/pekko/persistence/SnapshotSpec.scala    |   2 +-
 .../SnapshotSerializerMigrationAkkaSpec.scala      |   8 +-
 .../SnapshotSerializerNoMigrationSpec.scala        |   4 +-
 .../serialization/SnapshotSerializerSpec.scala     |  12 +-
 .../exception/DurableStateExceptionsSpec.scala     |   2 +-
 project/AddLogTimestamps.scala                     |   2 +-
 project/CopyrightHeaderForBoilerplate.scala        |   2 +-
 project/CopyrightHeaderForBuild.scala              |   2 +-
 project/CopyrightHeaderForJdk9.scala               |   2 +-
 project/CopyrightHeaderForProtobuf.scala           |   2 +-
 project/JavaFormatter.scala                        |   2 +-
 project/MultiNode.scala                            |   2 +-
 project/PekkoBuild.scala                           |   4 +-
 project/PekkoDevelocityPlugin.scala                |   2 +-
 project/Protobuf.scala                             |   2 +-
 project/SbtMultiJvmPlugin.scala                    |   4 +-
 project/ScalaFixExtraRulesPlugin.scala             |   2 +-
 project/ScalaFixForJdk9Plugin.scala                |   4 +-
 project/ScalafixForMultiNodePlugin.scala           |   4 +-
 project/ScalafixIgnoreFilePlugin.scala             |   4 +-
 project/StreamOperatorsIndexGenerator.scala        |   2 +-
 project/ValidatePullRequest.scala                  |   2 +-
 project/VersionGenerator.scala                     |   2 +-
 .../scala/org/apache/pekko/remote/Endpoint.scala   |   2 +-
 .../org/apache/pekko/remote/RemoteDaemon.scala     |   2 +-
 .../pekko/remote/RemoteMetricsExtension.scala      |   2 +-
 .../org/apache/pekko/remote/artery/Handshake.scala |   2 +-
 .../pekko/remote/artery/ImmutableLongMap.scala     |   2 +-
 .../pekko/remote/artery/RemoteInstrument.scala     |   2 +-
 .../remote/artery/RemotingFlightRecorder.scala     |   2 +-
 .../remote/artery/SystemMessageDelivery.scala      |   4 +-
 .../remote/artery/compress/CompressionTable.scala  |   2 +-
 .../pekko/remote/artery/tcp/ssl/X509Readers.scala  |   2 +-
 .../serialization/DaemonMsgCreateSerializer.scala  |   2 +-
 .../serialization/MessageContainerSerializer.scala |   2 +-
 .../serialization/MiscMessageSerializer.scala      |  14 +-
 .../remote/serialization/ProtobufSerializer.scala  |  16 +--
 .../serialization/SystemMessageSerializer.scala    |   2 +-
 .../RemoteInstrumentsSerializationSpec.scala       |   8 +-
 ...reateSerializerAllowJavaSerializationSpec.scala |   4 +-
 .../serialization/jackson/JacksonModule.scala      |  14 +-
 .../serialization/jackson/JacksonSerializer.scala  |  22 +--
 .../serialization/jackson/StreamRefModule.scala    |  24 ++--
 .../jackson/TypedActorRefModule.scala              |  12 +-
 .../serialization/jackson3/JacksonModule.scala     |  16 +--
 .../jackson3/JacksonObjectMapperProvider.scala     |  18 +--
 .../serialization/jackson3/JacksonSerializer.scala |  22 +--
 .../serialization/jackson3/StreamRefModule.scala   |  24 ++--
 .../jackson3/TypedActorRefModule.scala             |  12 +-
 .../org/apache/pekko/event/slf4j/Slf4jLogger.scala |  18 +--
 .../pekko/stream/testkit/StreamTestKit.scala       |   8 +-
 .../impl/fusing/GraphInterpreterSpecKit.scala      |  30 ++--
 .../apache/pekko/stream/testkit/ChainSetup.scala   |   6 +-
 .../apache/pekko/stream/testkit/ScriptedTest.scala |   2 +-
 .../apache/pekko/stream/testkit/StreamSpec.scala   |   2 +-
 .../pekko/stream/testkit/TwoStreamsSetup.scala     |   2 +-
 .../tck/FlatMapConcatDoubleSubscriberTest.scala    |   2 +-
 .../tck/PekkoIdentityProcessorVerification.scala   |   2 +-
 .../apache/pekko/stream/DslConsistencySpec.scala   |  40 +++---
 .../pekko/stream/DslFactoriesConsistencySpec.scala |  46 +++---
 .../apache/pekko/stream/impl/FixedBufferSpec.scala |  12 +-
 .../pekko/stream/impl/TraversalBuilderSpec.scala   |   2 +-
 .../impl/fusing/ActorGraphInterpreterSpec.scala    |   4 +-
 .../scaladsl/CoupledTerminationFlowSpec.scala      |   4 +-
 .../pekko/stream/scaladsl/FlowCompileSpec.scala    |  32 ++---
 .../pekko/stream/scaladsl/FlowConcatAllSpec.scala  |   2 +-
 .../pekko/stream/scaladsl/FlowConcatSpec.scala     |  14 +-
 .../pekko/stream/scaladsl/FlowGroupBySpec.scala    |  14 +-
 .../pekko/stream/scaladsl/FlowOnCompleteSpec.scala |   2 +-
 .../stream/scaladsl/FlowPrefixAndTailSpec.scala    |  12 +-
 .../pekko/stream/scaladsl/FlowScanAsyncSpec.scala  |   2 +-
 .../apache/pekko/stream/scaladsl/FlowSpec.scala    |  26 ++--
 .../pekko/stream/scaladsl/FlowSplitAfterSpec.scala |   6 +-
 .../pekko/stream/scaladsl/FlowSplitWhenSpec.scala  |   6 +-
 .../pekko/stream/scaladsl/FlowTakeSpec.scala       |   2 +-
 .../pekko/stream/scaladsl/GraphConcatSpec.scala    |   2 +-
 .../stream/scaladsl/GraphMergeLatestSpec.scala     |   2 +-
 .../stream/scaladsl/GraphMergePreferredSpec.scala  |   2 +-
 .../scaladsl/GraphMergePrioritizedSpec.scala       |   2 +-
 .../stream/scaladsl/GraphMergeSequenceSpec.scala   |   2 +-
 .../stream/scaladsl/GraphMergeSortedSpec.scala     |   2 +-
 .../pekko/stream/scaladsl/GraphMergeSpec.scala     |   2 +-
 .../stream/scaladsl/GraphOpsIntegrationSpec.scala  |   6 +-
 .../pekko/stream/scaladsl/GraphUnzipWithSpec.scala |   6 +-
 .../stream/scaladsl/GraphZipLatestWithSpec.scala   |   2 +-
 .../pekko/stream/scaladsl/GraphZipNSpec.scala      |   2 +-
 .../pekko/stream/scaladsl/GraphZipSpec.scala       |   2 +-
 .../pekko/stream/scaladsl/GraphZipWithNSpec.scala  |   2 +-
 .../pekko/stream/scaladsl/GraphZipWithSpec.scala   |   2 +-
 .../apache/pekko/stream/scaladsl/RestartSpec.scala |   2 +-
 .../SubstreamSubscriptionTimeoutSpec.scala         |   6 +-
 .../pekko/stream/MapAsyncPartitionedSpec.scala     |   2 +-
 .../stream/typed/ActorSourceSinkExample.scala      |   8 +-
 .../scala/org/apache/pekko/stream/FanInShape.scala |  12 +-
 .../org/apache/pekko/stream/FanOutShape.scala      |  12 +-
 .../main/scala/org/apache/pekko/stream/Shape.scala |  50 +++----
 .../apache/pekko/stream/impl/ActorPublisher.scala  |  12 +-
 .../stream/impl/ActorRefBackpressureSource.scala   |   2 +-
 .../pekko/stream/impl/ActorRefSinkStage.scala      |   2 +-
 .../apache/pekko/stream/impl/ActorRefSource.scala  |   2 +-
 .../pekko/stream/impl/CompletedPublishers.scala    |   6 +-
 .../stream/impl/FanoutPublisherBridgeStage.scala   |  14 +-
 .../stream/impl/JavaFlowAndRsConverters.scala      |   8 +-
 .../pekko/stream/impl/JavaStreamConcat.scala       |   4 +-
 .../impl/PhasedFusingActorMaterializer.scala       |   2 +-
 .../org/apache/pekko/stream/impl/QueueSource.scala |   2 +-
 .../scala/org/apache/pekko/stream/impl/Sinks.scala |   4 +-
 .../apache/pekko/stream/impl/StreamLayout.scala    |  32 ++---
 .../stream/impl/StreamSubscriptionTimeout.scala    |  12 +-
 .../pekko/stream/impl/SubscriberManagement.scala   |   8 +-
 .../pekko/stream/impl/TraversalBuilder.scala       |  26 ++--
 .../stream/impl/fusing/ActorGraphInterpreter.scala |   2 +-
 .../pekko/stream/impl/fusing/FlattenConcat.scala   |   4 +-
 .../pekko/stream/impl/fusing/GraphStages.scala     |   4 +-
 .../pekko/stream/impl/fusing/InflightSources.scala |   4 +-
 .../org/apache/pekko/stream/impl/fusing/Ops.scala  |  10 +-
 .../pekko/stream/impl/fusing/StreamOfStreams.scala |  14 +-
 .../pekko/stream/impl/io/InputStreamSource.scala   |   2 +-
 .../stream/impl/io/OutputStreamGraphStage.scala    |   2 +-
 .../pekko/stream/impl/streamref/SinkRefImpl.scala  |   2 +-
 .../stream/impl/streamref/SourceRefImpl.scala      |   2 +-
 .../org/apache/pekko/stream/javadsl/Flow.scala     |  98 ++++++-------
 .../pekko/stream/javadsl/FlowWithContext.scala     |   2 +-
 .../org/apache/pekko/stream/javadsl/Graph.scala    |  30 ++--
 .../apache/pekko/stream/javadsl/RestartFlow.scala  |   4 +-
 .../apache/pekko/stream/javadsl/RestartSink.scala  |   2 +-
 .../pekko/stream/javadsl/RestartSource.scala       |   4 +-
 .../org/apache/pekko/stream/javadsl/Sink.scala     |  10 +-
 .../org/apache/pekko/stream/javadsl/Source.scala   | 106 +++++++-------
 .../pekko/stream/javadsl/SourceWithContext.scala   |   2 +-
 .../pekko/stream/javadsl/StreamConverters.scala    |   4 +-
 .../org/apache/pekko/stream/javadsl/SubFlow.scala  |  74 +++++-----
 .../apache/pekko/stream/javadsl/SubSource.scala    |  74 +++++-----
 .../org/apache/pekko/stream/javadsl/package.scala  |   2 +-
 .../org/apache/pekko/stream/scaladsl/Flow.scala    |  48 +++----
 .../pekko/stream/scaladsl/FlowWithContext.scala    |   8 +-
 .../pekko/stream/scaladsl/FlowWithContextOps.scala |   8 +-
 .../org/apache/pekko/stream/scaladsl/Graph.scala   | 102 +++++++-------
 .../pekko/stream/scaladsl/JavaFlowSupport.scala    |   2 +-
 .../apache/pekko/stream/scaladsl/RestartFlow.scala |  10 +-
 .../apache/pekko/stream/scaladsl/RestartSink.scala |   4 +-
 .../pekko/stream/scaladsl/RestartSource.scala      |   6 +-
 .../org/apache/pekko/stream/scaladsl/Sink.scala    |   6 +-
 .../org/apache/pekko/stream/scaladsl/Source.scala  |  10 +-
 .../pekko/stream/scaladsl/SourceWithContext.scala  |   8 +-
 .../pekko/stream/scaladsl/StreamConverters.scala   |   4 +-
 .../org/apache/pekko/stream/scaladsl/Tcp.scala     |   6 +-
 .../stream/serialization/StreamRefSerializer.scala |  18 +--
 .../org/apache/pekko/stream/stage/GraphStage.scala |  56 ++++----
 .../apache/pekko/stream/stage/StageLogging.scala   |   2 +-
 .../apache/pekko/testkit/TestEventListener.scala   |   8 +-
 .../apache/pekko/testkit/TestJavaSerializer.scala  |   2 +-
 .../scala/org/apache/pekko/testkit/TestKit.scala   |  18 +--
 .../org/apache/pekko/testkit/TestKitUtils.scala    |   2 +-
 .../apache/pekko/testkit/javadsl/EventFilter.scala |  10 +-
 .../org/apache/pekko/testkit/javadsl/TestKit.scala |   4 +-
 .../scala/org/apache/pekko/testkit/PekkoSpec.scala |   8 +-
 .../apache/pekko/testkit/TestActorRefSpec.scala    |   2 +-
 .../metrics/reporter/PekkoConsoleReporter.scala    |   6 +-
 448 files changed, 1961 insertions(+), 1950 deletions(-)

diff --git a/.scalafmt.conf b/.scalafmt.conf
index 31f933e39b..741e757826 100644
--- a/.scalafmt.conf
+++ b/.scalafmt.conf
@@ -1,5 +1,5 @@
 version                                  = 3.11.1
-runner.dialect                           = scala213
+runner.dialect                           = scala213source3
 project.git                              = true
 style                                    = defaultWithAlign
 docstrings.style                         = Asterisk
@@ -76,3 +76,13 @@ project.excludeFilters = [
   "scripts/authors.scala"
 ]
 project.layout         = StandardConvention
+
+rewrite.scala3.convertToNewSyntax = true
+runner {
+  dialectOverride {
+    allowSignificantIndentation = false
+    allowAsForImportRename = false
+    allowStarWildcardImport = false
+    allowPostfixStarVarargSplices = false
+  }
+}
diff --git a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/Effect.scala b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/Effect.scala
index 32c3ce7998..ca1d04505b 100644
--- a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/Effect.scala
+++ b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/Effect.scala
@@ -100,7 +100,7 @@ object Effect {
       with Serializable {
 
     override def equals(other: Any) = other match {
-      case o: Spawned[_] =>
+      case o: Spawned[?] =>
         this.behavior == o.behavior &&
         this.childName == o.childName &&
         this.props == o.props
@@ -113,7 +113,7 @@ object Effect {
     override def _1: Behavior[T] = behavior
     override def _2: String = childName
     override def _3: Props = props
-    override def canEqual(o: Any) = o.isInstanceOf[Spawned[_]]
+    override def canEqual(o: Any) = o.isInstanceOf[Spawned[?]]
   }
 
   object Spawned {
@@ -131,7 +131,7 @@ object Effect {
       with Serializable {
 
     override def equals(other: Any) = other match {
-      case o: SpawnedAnonymous[_] => this.behavior == o.behavior && this.props == o.props
+      case o: SpawnedAnonymous[?] => this.behavior == o.behavior && this.props == o.props
       case _                      => false
     }
     override def hashCode: Int = behavior.## * 31 + props.##
@@ -140,7 +140,7 @@ object Effect {
     override def productPrefix = "SpawnedAnonymous"
     override def _1: Behavior[T] = behavior
     override def _2: Props = props
-    override def canEqual(o: Any) = o.isInstanceOf[SpawnedAnonymous[_]]
+    override def canEqual(o: Any) = o.isInstanceOf[SpawnedAnonymous[?]]
   }
 
   object SpawnedAnonymous {
@@ -160,7 +160,7 @@ object Effect {
       with Serializable {
 
     override def equals(other: Any) = other match {
-      case o: SpawnedAdapter[_] => this.name == o.name
+      case o: SpawnedAdapter[?] => this.name == o.name
       case _                    => false
     }
     override def hashCode: Int = name.##
@@ -168,7 +168,7 @@ object Effect {
 
     override def productPrefix = "SpawnedAdapter"
     override def _1: String = name
-    override def canEqual(o: Any) = o.isInstanceOf[SpawnedAdapter[_]]
+    override def canEqual(o: Any) = o.isInstanceOf[SpawnedAdapter[?]]
   }
 
   /**
@@ -192,17 +192,17 @@ object Effect {
       with Serializable {
 
     override def equals(other: Any): Boolean = other match {
-      case _: SpawnedAnonymousAdapter[_] => true
+      case _: SpawnedAnonymousAdapter[?] => true
       case _                             => false
     }
     override def hashCode: Int = Nil.##
     override def toString: String = "SpawnedAnonymousAdapter"
 
     override def productPrefix: String = "SpawnedAnonymousAdapter"
-    override def productIterator: Iterator[_] = Iterator.empty
+    override def productIterator: Iterator[?] = Iterator.empty
     override def productArity: Int = 0
     override def productElement(n: Int) = throw new NoSuchElementException
-    override def canEqual(o: Any): Boolean = o.isInstanceOf[SpawnedAnonymousAdapter[_]]
+    override def canEqual(o: Any): Boolean = o.isInstanceOf[SpawnedAnonymousAdapter[?]]
   }
 
   /**
diff --git a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/TestKitSettings.scala b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/TestKitSettings.scala
index 42251512a3..6c04373658 100644
--- a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/TestKitSettings.scala
+++ b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/TestKitSettings.scala
@@ -29,7 +29,7 @@ object TestKitSettings {
   /**
    * Reads configuration settings from `pekko.actor.testkit.typed` section.
    */
-  def apply(system: ActorSystem[_]): TestKitSettings =
+  def apply(system: ActorSystem[?]): TestKitSettings =
     Ext(system).settings
 
   /**
@@ -42,7 +42,7 @@ object TestKitSettings {
   /**
    * Java API: Reads configuration settings from `pekko.actor.testkit.typed` section.
    */
-  def create(system: ActorSystem[_]): TestKitSettings =
+  def create(system: ActorSystem[?]): TestKitSettings =
     apply(system)
 
   /**
@@ -53,11 +53,11 @@ object TestKitSettings {
     new TestKitSettings(config)
 
   private object Ext extends ExtensionId[Ext] {
-    override def createExtension(system: ActorSystem[_]): Ext = new Ext(system)
-    def get(system: ActorSystem[_]): Ext = Ext.apply(system)
+    override def createExtension(system: ActorSystem[?]): Ext = new Ext(system)
+    def get(system: ActorSystem[?]): Ext = Ext.apply(system)
   }
 
-  private class Ext(system: ActorSystem[_]) extends Extension {
+  private class Ext(system: ActorSystem[?]) extends Extension {
     val settings: TestKitSettings = TestKitSettings(system.settings.config.getConfig("pekko.actor.testkit.typed"))
   }
 }
diff --git a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/internal/ActorSystemStub.scala b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/internal/ActorSystemStub.scala
index b1b77a7c04..71882d690d 100644
--- a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/internal/ActorSystemStub.scala
+++ b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/internal/ActorSystemStub.scala
@@ -135,7 +135,7 @@ import com.typesafe.config.{ Config, ConfigFactory }
   override def extension[T <: Extension](ext: ExtensionId[T]): T =
     throw new UnsupportedOperationException("ActorSystemStub cannot register extensions")
 
-  override def hasExtension(ext: ExtensionId[_ <: Extension]): Boolean =
+  override def hasExtension(ext: ExtensionId[? <: Extension]): Boolean =
     throw new UnsupportedOperationException("ActorSystemStub cannot register extensions")
 
   override def log: Logger = LoggerFactory.getLogger(getClass)
diff --git a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/internal/LoggingTestKitImpl.scala b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/internal/LoggingTestKitImpl.scala
index d2187e9176..66a3727e99 100644
--- a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/internal/LoggingTestKitImpl.scala
+++ b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/internal/LoggingTestKitImpl.scala
@@ -48,7 +48,7 @@ import org.slf4j.event.Level
     source: Option[String],
     messageContains: Option[String],
     messageRegex: Option[Regex],
-    cause: Option[Class[_ <: Throwable]],
+    cause: Option[Class[? <: Throwable]],
     mdc: Map[String, String],
     checkExcess: Boolean,
     custom: Option[Function[LoggingEvent, Boolean]])
@@ -95,7 +95,7 @@ import org.slf4j.event.Level
       todo > 0
   }
 
-  override def expect[T](code: => T)(implicit system: ActorSystem[_]): T = {
+  override def expect[T](code: => T)(implicit system: ActorSystem[?]): T = {
     val effectiveLoggerName = loggerName.getOrElse("")
     checkLogback(system)
     TestAppender.setupTestAppender(effectiveLoggerName)
@@ -120,10 +120,10 @@ import org.slf4j.event.Level
     }
   }
 
-  override def expect[T](system: ActorSystem[_], code: Supplier[T]): T =
+  override def expect[T](system: ActorSystem[?], code: Supplier[T]): T =
     expect(code.get())(system)
 
-  private def checkLogback(system: ActorSystem[_]): Unit = {
+  private def checkLogback(system: ActorSystem[?]): Unit = {
     if (!system.dynamicAccess.classIsOnClasspath("ch.qos.logback.classic.spi.ILoggingEvent")) {
       throw new IllegalStateException("LoggingEventFilter requires logback-classic dependency in classpath.")
     }
@@ -166,7 +166,7 @@ import org.slf4j.event.Level
   override def withCustom(newCustom: Function[LoggingEvent, Boolean]): LoggingTestKitImpl =
     copy(custom = Option(newCustom))
 
-  override def withCause(newCause: Class[_ <: Throwable]): javadsl.LoggingTestKit =
+  override def withCause(newCause: Class[? <: Throwable]): javadsl.LoggingTestKit =
     copy(cause = Option(newCause))
 
 }
diff --git a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/internal/StubbedActorContext.scala b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/internal/StubbedActorContext.scala
index 4bf7f51746..b765bd62a0 100644
--- a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/internal/StubbedActorContext.scala
+++ b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/internal/StubbedActorContext.scala
@@ -90,7 +90,7 @@ private[pekko] final class FunctionRef[-T](override val path: ActorPath, send: (
   @InternalApi private[pekko] val selfInbox = new TestInboxImpl[T](path)
 
   override val self = selfInbox.ref
-  private var _children = TreeMap.empty[String, BehaviorTestKitImpl[_]]
+  private var _children = TreeMap.empty[String, BehaviorTestKitImpl[?]]
   private val childName = Iterator.from(0).map(Helpers.base64(_))
   private val substituteLoggerFactory = new SubstituteLoggerFactory
   private val logger: Logger = substituteLoggerFactory.getLogger("StubbedLogger")
@@ -230,7 +230,7 @@ private[pekko] final class FunctionRef[-T](override val path: ActorPath, send: (
     checkCurrentActorThread()
   }
 
-  override def setLoggerName(clazz: Class[_]): Unit = {
+  override def setLoggerName(clazz: Class[?]): Unit = {
     // nop as we don't track logger
     checkCurrentActorThread()
   }
diff --git a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/internal/TestKitUtils.scala b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/internal/TestKitUtils.scala
index 5d96d9ab8d..6445998cda 100644
--- a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/internal/TestKitUtils.scala
+++ b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/internal/TestKitUtils.scala
@@ -79,7 +79,7 @@ private[pekko] object TestKitUtils {
   // common internal utility impls for Java and Scala
   private val TestKitRegex = """org\.apache\.pekko\.testkit\.typed\.(?:javadsl|scaladsl)\.ActorTestKit(?:\$.*)?""".r
 
-  def testNameFromCallStack(classToStartFrom: Class[_]): String =
+  def testNameFromCallStack(classToStartFrom: Class[?]): String =
     pekko.testkit.TestKitUtils.testNameFromCallStack(classToStartFrom, TestKitRegex)
 
   /**
@@ -90,7 +90,7 @@ private[pekko] object TestKitUtils {
   def scrubActorSystemName(name: String): String =
     pekko.testkit.TestKitUtils.scrubActorSystemName(name)
 
-  def shutdown(system: ActorSystem[_], timeout: Duration, throwIfShutdownTimesOut: Boolean): Unit = {
+  def shutdown(system: ActorSystem[?], timeout: Duration, throwIfShutdownTimesOut: Boolean): Unit = {
     system.terminate()
     try Await.ready(system.whenTerminated, timeout)
     catch {
diff --git a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/internal/TestProbeImpl.scala b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/internal/TestProbeImpl.scala
index 1bb38e9e93..0be9c61f41 100644
--- a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/internal/TestProbeImpl.scala
+++ b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/internal/TestProbeImpl.scala
@@ -74,7 +74,7 @@ private[pekko] object TestProbeImpl {
 }
 
 @InternalApi
-private[pekko] final class TestProbeImpl[M](name: String, system: ActorSystem[_])
+private[pekko] final class TestProbeImpl[M](name: String, system: ActorSystem[?])
     extends JavaTestProbe[M]
     with ScalaTestProbe[M]
     with InternalRecipientRef[M] {
diff --git a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/javadsl/ActorTestKit.scala b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/javadsl/ActorTestKit.scala
index cb599f57fb..d6ce52aca4 100644
--- a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/javadsl/ActorTestKit.scala
+++ b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/javadsl/ActorTestKit.scala
@@ -57,7 +57,7 @@ object ActorTestKit {
    * Config loaded from the provided actor if that exists, otherwise
    * using default configuration from the reference.conf resources that ship with the Akka libraries.
    */
-  def create(system: ActorSystem[_]): ActorTestKit =
+  def create(system: ActorSystem[?]): ActorTestKit =
     new ActorTestKit(scaladsl.ActorTestKit(system))
 
   /**
@@ -123,7 +123,7 @@ object ActorTestKit {
    *                             an error is printed to stdout when the system did not shutdown but
    *                             no exception is thrown.
    */
-  def shutdown(system: ActorSystem[_], duration: Duration, throwIfShutdownTimesOut: Boolean): Unit = {
+  def shutdown(system: ActorSystem[?], duration: Duration, throwIfShutdownTimesOut: Boolean): Unit = {
     TestKitUtils.shutdown(system, duration.toScala, throwIfShutdownTimesOut)
   }
 
@@ -132,7 +132,7 @@ object ActorTestKit {
    * if more time than `system-shutdown-default` passes an exception is thrown
    * (can be configured with `throw-on-shutdown-timeout`).
    */
-  def shutdown(system: ActorSystem[_], duration: Duration): Unit = {
+  def shutdown(system: ActorSystem[?], duration: Duration): Unit = {
     val settings = TestKitSettings.create(system)
     shutdown(system, duration, settings.ThrowOnShutdownTimeout)
   }
@@ -142,7 +142,7 @@ object ActorTestKit {
    * if more time than `system-shutdown-default` passes an exception is thrown
    * (can be configured with `throw-on-shutdown-timeout`).
    */
-  def shutdown(system: ActorSystem[_]): Unit = {
+  def shutdown(system: ActorSystem[?]): Unit = {
     val settings = TestKitSettings.create(system)
     shutdown(system, settings.DefaultActorSystemShutdownTimeout.toJava, settings.ThrowOnShutdownTimeout)
   }
diff --git a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/javadsl/JUnit5TestKitBuilder.scala b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/javadsl/JUnit5TestKitBuilder.scala
index 6cbea0f6a8..d71359d099 100644
--- a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/javadsl/JUnit5TestKitBuilder.scala
+++ b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/javadsl/JUnit5TestKitBuilder.scala
@@ -27,13 +27,13 @@ import com.typesafe.config.Config
 @deprecated("Use JUnitJupiterTestKitBuilder instead", "2.0.0")
 final class JUnit5TestKitBuilder() {
 
-  var system: Option[ActorSystem[_]] = None
+  var system: Option[ActorSystem[?]] = None
 
   var customConfig: Config = ApplicationTestConfig
 
   var name: String = TestKitUtils.testNameFromCallStack(classOf[JUnit5TestKitBuilder])
 
-  def withSystem(system: ActorSystem[_]): JUnit5TestKitBuilder = {
+  def withSystem(system: ActorSystem[?]): JUnit5TestKitBuilder = {
     this.system = Some(system)
     this
   }
diff --git a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/javadsl/JUnitJupiterTestKitBuilder.scala b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/javadsl/JUnitJupiterTestKitBuilder.scala
index 256ecf8cb2..c384620fba 100644
--- a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/javadsl/JUnitJupiterTestKitBuilder.scala
+++ b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/javadsl/JUnitJupiterTestKitBuilder.scala
@@ -26,13 +26,13 @@ import com.typesafe.config.Config
 
 final class JUnitJupiterTestKitBuilder() {
 
-  var system: Option[ActorSystem[_]] = None
+  var system: Option[ActorSystem[?]] = None
 
   var customConfig: Config = ApplicationTestConfig
 
   var name: String = TestKitUtils.testNameFromCallStack(classOf[JUnitJupiterTestKitBuilder])
 
-  def withSystem(system: ActorSystem[_]): JUnitJupiterTestKitBuilder = {
+  def withSystem(system: ActorSystem[?]): JUnitJupiterTestKitBuilder = {
     this.system = Some(system)
     this
   }
diff --git a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/javadsl/LoggingTestKit.scala b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/javadsl/LoggingTestKit.scala
index d8a7723722..5323c25cd9 100644
--- a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/javadsl/LoggingTestKit.scala
+++ b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/javadsl/LoggingTestKit.scala
@@ -78,7 +78,7 @@ import org.slf4j.event.Level
    * Matching events with an included `throwable` that is a class or subclass of the given
    * `Throwable` class.
    */
-  def withCause(newCause: Class[_ <: Throwable]): LoggingTestKit
+  def withCause(newCause: Class[? <: Throwable]): LoggingTestKit
 
   /**
    * Matching events with MDC containing all entries of the given `Map`.
@@ -109,7 +109,7 @@ import org.slf4j.event.Level
    *
    * Care is taken to remove the testkit when the block is finished or aborted.
    */
-  def expect[T](system: ActorSystem[_], code: Supplier[T]): T
+  def expect[T](system: ActorSystem[?], code: Supplier[T]): T
 
 }
 
@@ -198,7 +198,7 @@ object LoggingTestKit {
    *
    * More conditions can be added to the returned [LoggingEventFilter].
    */
-  def error(causeClass: Class[_ <: Throwable]): LoggingTestKit =
+  def error(causeClass: Class[? <: Throwable]): LoggingTestKit =
     empty.withLogLevel(Level.ERROR).withCause(causeClass)
 
   /**
diff --git a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/javadsl/ManualTime.scala b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/javadsl/ManualTime.scala
index 896932a58f..abb91dfa6a 100644
--- a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/javadsl/ManualTime.scala
+++ b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/javadsl/ManualTime.scala
@@ -73,7 +73,7 @@ final class ManualTime(delegate: pekko.testkit.ExplicitlyTriggeredScheduler) {
   def timePasses(amount: Duration): Unit = delegate.timePasses(amount.toScala)
 
   @varargs
-  def expectNoMessageFor(duration: Duration, on: TestProbe[_]*): Unit = {
+  def expectNoMessageFor(duration: Duration, on: TestProbe[?]*): Unit = {
     delegate.timePasses(duration.toScala)
     on.foreach(_.expectNoMessage(Duration.ZERO))
   }
diff --git a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/javadsl/SerializationTestKit.scala b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/javadsl/SerializationTestKit.scala
index 16b47af91c..768e5c7ab8 100644
--- a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/javadsl/SerializationTestKit.scala
+++ b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/javadsl/SerializationTestKit.scala
@@ -20,7 +20,7 @@ import pekko.actor.typed.ActorSystem
 /**
  * Utilities to test serialization.
  */
-class SerializationTestKit(system: ActorSystem[_]) {
+class SerializationTestKit(system: ActorSystem[?]) {
 
   private val delegate = new scaladsl.SerializationTestKit(system)
 
diff --git a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/javadsl/TestKitJunitResource.scala b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/javadsl/TestKitJunitResource.scala
index 3c240c662f..5b85c2d386 100644
--- a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/javadsl/TestKitJunitResource.scala
+++ b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/javadsl/TestKitJunitResource.scala
@@ -72,7 +72,7 @@ final class TestKitJunitResource(_kit: ActorTestKit) extends ExternalResource {
   /**
    * Use a custom [[pekko.actor.typed.ActorSystem]] for the actor system.
    */
-  def this(system: ActorSystem[_]) = this(ActorTestKit.create(system))
+  def this(system: ActorSystem[?]) = this(ActorTestKit.create(system))
 
   /**
    * Use a custom config for the actor system.
diff --git a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/javadsl/TestProbe.scala b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/javadsl/TestProbe.scala
index 8f602a5cc6..bba58f2c45 100644
--- a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/javadsl/TestProbe.scala
+++ b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/javadsl/TestProbe.scala
@@ -55,16 +55,16 @@ object FishingOutcomes {
 
 object TestProbe {
 
-  def create[M](system: ActorSystem[_]): TestProbe[M] =
+  def create[M](system: ActorSystem[?]): TestProbe[M] =
     create(name = "testProbe", system)
 
-  def create[M](@nowarn("msg=never used") clazz: Class[M], system: ActorSystem[_]): TestProbe[M] =
+  def create[M](@nowarn("msg=never used") clazz: Class[M], system: ActorSystem[?]): TestProbe[M] =
     create(system)
 
-  def create[M](name: String, system: ActorSystem[_]): TestProbe[M] =
+  def create[M](name: String, system: ActorSystem[?]): TestProbe[M] =
     new TestProbeImpl[M](name, system)
 
-  def create[M](name: String, @nowarn("msg=never used") clazz: Class[M], system: ActorSystem[_]): TestProbe[M] =
+  def create[M](name: String, @nowarn("msg=never used") clazz: Class[M], system: ActorSystem[?]): TestProbe[M] =
     new TestProbeImpl[M](name, system)
 }
 
diff --git a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/scaladsl/ActorTestKit.scala b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/scaladsl/ActorTestKit.scala
index 01f6a36297..7476271ffd 100644
--- a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/scaladsl/ActorTestKit.scala
+++ b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/scaladsl/ActorTestKit.scala
@@ -75,7 +75,7 @@ object ActorTestKit {
    * Config loaded from the provided actor if that exists, otherwise
    * using default configuration from the reference.conf resources that ship with the Akka libraries.
    */
-  def apply(system: ActorSystem[_]): ActorTestKit = {
+  def apply(system: ActorSystem[?]): ActorTestKit = {
     val name = testKitGuardianCounter.incrementAndGet() match {
       case 1 => "test"
       case n => s"test-$n"
@@ -160,7 +160,7 @@ object ActorTestKit {
    * Shutdown the given [[pekko.actor.typed.ActorSystem]] and block until it shuts down,
    * if more time than `TestKitSettings.DefaultActorSystemShutdownTimeout` passes an exception is thrown
    */
-  def shutdown(system: ActorSystem[_]): Unit = {
+  def shutdown(system: ActorSystem[?]): Unit = {
     val settings = TestKitSettings(system)
     TestKitUtils.shutdown(system, settings.DefaultActorSystemShutdownTimeout, settings.ThrowOnShutdownTimeout)
   }
@@ -169,7 +169,7 @@ object ActorTestKit {
    * Shutdown the given [[pekko.actor.typed.ActorSystem]] and block until it shuts down
    * or the `duration` hits. If the timeout hits `verifySystemShutdown` decides
    */
-  def shutdown(system: ActorSystem[_], timeout: Duration, throwIfShutdownFails: Boolean = false): Unit =
+  def shutdown(system: ActorSystem[?], timeout: Duration, throwIfShutdownFails: Boolean = false): Unit =
     TestKitUtils.shutdown(system, timeout, throwIfShutdownFails)
 
   /**
@@ -193,7 +193,7 @@ object ActorTestKit {
  * For synchronous testing of a `Behavior` see [[BehaviorTestKit]]
  */
 final class ActorTestKit private[pekko] (
-    val internalSystem: ActorSystem[_],
+    val internalSystem: ActorSystem[?],
     internalTestKitGuardian: ActorRef[ActorTestKitGuardian.TestKitCommand],
     settings: Option[TestKitSettings]) {
 
diff --git a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/scaladsl/LoggingTestKit.scala b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/scaladsl/LoggingTestKit.scala
index 23d238c0b6..c0bb5c02b0 100644
--- a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/scaladsl/LoggingTestKit.scala
+++ b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/scaladsl/LoggingTestKit.scala
@@ -108,7 +108,7 @@ import org.slf4j.event.Level
    *
    * Care is taken to remove the testkit when the block is finished or aborted.
    */
-  def expect[T](code: => T)(implicit system: ActorSystem[_]): T
+  def expect[T](code: => T)(implicit system: ActorSystem[?]): T
 }
 
 /**
diff --git a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/scaladsl/ManualTime.scala b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/scaladsl/ManualTime.scala
index 7074941447..ae765bcbfe 100644
--- a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/scaladsl/ManualTime.scala
+++ b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/scaladsl/ManualTime.scala
@@ -41,7 +41,7 @@ object ManualTime {
    * Access the manual scheduler, note that you need to setup the actor system/testkit with [[ManualTime.config]]
    * for this to work.
    */
-  def apply()(implicit system: ActorSystem[_]): ManualTime =
+  def apply()(implicit system: ActorSystem[?]): ManualTime =
     system.scheduler match {
       case adapter: SchedulerAdapter =>
         adapter.classicScheduler match {
@@ -73,7 +73,7 @@ final class ManualTime(delegate: pekko.testkit.ExplicitlyTriggeredScheduler) {
   def timePasses(amount: FiniteDuration): Unit = delegate.timePasses(amount)
 
   @varargs
-  def expectNoMessageFor(duration: FiniteDuration, on: TestProbe[_]*): Unit = {
+  def expectNoMessageFor(duration: FiniteDuration, on: TestProbe[?]*): Unit = {
     delegate.timePasses(duration)
     on.foreach(_.expectNoMessage(Duration.Zero))
   }
diff --git a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/scaladsl/ScalaTestWithActorTestKit.scala b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/scaladsl/ScalaTestWithActorTestKit.scala
index cfa2a49248..a922ff7bbe 100644
--- a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/scaladsl/ScalaTestWithActorTestKit.scala
+++ b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/scaladsl/ScalaTestWithActorTestKit.scala
@@ -53,7 +53,7 @@ abstract class ScalaTestWithActorTestKit(override val testKit: ActorTestKit)
   /**
    * Use a custom [[pekko.actor.typed.ActorSystem]] for the actor system.
    */
-  def this(system: ActorSystem[_]) = this(ActorTestKit(system))
+  def this(system: ActorSystem[?]) = this(ActorTestKit(system))
 
   /**
    * Use a custom config for the actor system.
diff --git a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/scaladsl/SerializationTestKit.scala b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/scaladsl/SerializationTestKit.scala
index 84ecfb2adf..691291aa15 100644
--- a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/scaladsl/SerializationTestKit.scala
+++ b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/scaladsl/SerializationTestKit.scala
@@ -22,7 +22,7 @@ import pekko.serialization.Serializers
 /**
  * Utilities to test serialization.
  */
-class SerializationTestKit(system: ActorSystem[_]) {
+class SerializationTestKit(system: ActorSystem[?]) {
 
   private val serialization = SerializationExtension(system.toClassic)
 
diff --git a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/scaladsl/TestProbe.scala b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/scaladsl/TestProbe.scala
index 4ec7625a84..ff215bc741 100644
--- a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/scaladsl/TestProbe.scala
+++ b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/scaladsl/TestProbe.scala
@@ -52,10 +52,10 @@ object FishingOutcomes {
 }
 
 object TestProbe {
-  def apply[M]()(implicit system: ActorSystem[_]): TestProbe[M] =
+  def apply[M]()(implicit system: ActorSystem[?]): TestProbe[M] =
     apply(name = "testProbe")
 
-  def apply[M](name: String)(implicit system: ActorSystem[_]): TestProbe[M] =
+  def apply[M](name: String)(implicit system: ActorSystem[?]): TestProbe[M] =
     new TestProbeImpl[M](name, system)
 
 }
diff --git a/actor-testkit-typed/src/test/scala/docs/org/apache/pekko/actor/testkit/typed/scaladsl/SyncTestingExampleSpec.scala b/actor-testkit-typed/src/test/scala/docs/org/apache/pekko/actor/testkit/typed/scaladsl/SyncTestingExampleSpec.scala
index 34a5e4d84f..8fe060f658 100644
--- a/actor-testkit-typed/src/test/scala/docs/org/apache/pekko/actor/testkit/typed/scaladsl/SyncTestingExampleSpec.scala
+++ b/actor-testkit-typed/src/test/scala/docs/org/apache/pekko/actor/testkit/typed/scaladsl/SyncTestingExampleSpec.scala
@@ -233,10 +233,10 @@ class SyncTestingExampleSpec extends AnyWordSpec with Matchers {
 
       testKit.run(ConfigAware.SpawnChild(inbox.ref.narrow))
       val childTestKit = inbox.receiveMessage() match {
-        case ar: ActorRef[_] =>
+        case ar: ActorRef[?] =>
           testKit.childTestKit(ar.unsafeUpcast[Any].narrow[ConfigAware.Command])
         case unexpected =>
-          unexpected should be(a[ActorRef[_]])
+          unexpected should be(a[ActorRef[?]])
           ???
       }
 
diff --git a/actor-testkit-typed/src/test/scala/org/apache/pekko/actor/testkit/typed/scaladsl/ActorTestKitSpec.scala b/actor-testkit-typed/src/test/scala/org/apache/pekko/actor/testkit/typed/scaladsl/ActorTestKitSpec.scala
index 5061ca4fe5..25d4edd98c 100644
--- a/actor-testkit-typed/src/test/scala/org/apache/pekko/actor/testkit/typed/scaladsl/ActorTestKitSpec.scala
+++ b/actor-testkit-typed/src/test/scala/org/apache/pekko/actor/testkit/typed/scaladsl/ActorTestKitSpec.scala
@@ -56,7 +56,7 @@ class ActorTestKitSpec extends ScalaTestWithActorTestKit with AnyWordSpecLike wi
     }
 
     "use name from given class name with replaced package name" in {
-      val testkit2 = ActorTestKit(classOf[Vector[_]].getName)
+      val testkit2 = ActorTestKit(classOf[Vector[?]].getName)
       try {
         // removing package name and such
         testkit2.system.name should ===("Vector")
@@ -171,7 +171,7 @@ class MyConcreteDerivateSpec extends MyBaseSpec {
     }
 
     "use name from given class name" in {
-      val testkit2 = ActorTestKit(classOf[Vector[_]].getName)
+      val testkit2 = ActorTestKit(classOf[Vector[?]].getName)
       try {
         testkit2.system.name should ===("Vector")
       } finally testkit2.shutdownTestKit()
diff --git a/actor-testkit-typed/src/test/scala/org/apache/pekko/actor/testkit/typed/scaladsl/BehaviorTestKitSpec.scala b/actor-testkit-typed/src/test/scala/org/apache/pekko/actor/testkit/typed/scaladsl/BehaviorTestKitSpec.scala
index f85c92f35e..4f13e0d415 100644
--- a/actor-testkit-typed/src/test/scala/org/apache/pekko/actor/testkit/typed/scaladsl/BehaviorTestKitSpec.scala
+++ b/actor-testkit-typed/src/test/scala/org/apache/pekko/actor/testkit/typed/scaladsl/BehaviorTestKitSpec.scala
@@ -210,7 +210,7 @@ class BehaviorTestKitSpec extends AnyWordSpec with Matchers with LogCapturing {
     "allow assertions on effect type" in {
       val testkit = BehaviorTestKit[Parent.Command](Parent.init)
       testkit.run(SpawnAnonymous(1))
-      val spawnAnonymous = testkit.expectEffectType[Effect.SpawnedAnonymous[_]]
+      val spawnAnonymous = testkit.expectEffectType[Effect.SpawnedAnonymous[?]]
       spawnAnonymous.props should ===(Props.empty)
     }
 
@@ -401,7 +401,7 @@ class BehaviorTestKitSpec extends AnyWordSpec with Matchers with LogCapturing {
       val sessionRef =
         testkit.runAsk[ActorRef[String]](SpawnSession(_, h.ref)).receiveReply()
 
-      val s = testkit.expectEffectType[SpawnedAnonymous[_]]
+      val s = testkit.expectEffectType[SpawnedAnonymous[?]]
       // must be able to get the created ref, even without explicit reply
       s.ref shouldBe sessionRef
 
@@ -423,7 +423,7 @@ class BehaviorTestKitSpec extends AnyWordSpec with Matchers with LogCapturing {
       testkit.expectEffect(Stopped(child.childName))
 
       testkit.run(SpawnChild)
-      val newChild = testkit.expectEffectType[Spawned[_]]
+      val newChild = testkit.expectEffectType[Spawned[?]]
       child.childName shouldBe newChild.childName
     }
   }
diff --git a/actor-tests/src/test/scala-3/org/apache/pekko/util/LineNumberSpec.scala b/actor-tests/src/test/scala-3/org/apache/pekko/util/LineNumberSpec.scala
index 0cb668d49f..87837251e9 100644
--- a/actor-tests/src/test/scala-3/org/apache/pekko/util/LineNumberSpec.scala
+++ b/actor-tests/src/test/scala-3/org/apache/pekko/util/LineNumberSpec.scala
@@ -15,14 +15,14 @@ package org.apache.pekko.util
 
 import org.apache.pekko
 import pekko.testkit.PekkoSpec
-import pekko.util.LineNumbers._
+import pekko.util.LineNumbers.*
 
 class LineNumberSpec extends PekkoSpec {
 
   "LineNumbers" when {
 
     "writing Scala" must {
-      import LineNumberSpecCodeForScala._
+      import LineNumberSpecCodeForScala.*
 
       "work for small functions" in {
         LineNumbers(oneline) should ===(SourceFileLines("LineNumberSpecCodeForScala.scala", 22, 22))
diff --git a/actor-tests/src/test/scala/org/apache/pekko/PekkoExceptionSpec.scala b/actor-tests/src/test/scala/org/apache/pekko/PekkoExceptionSpec.scala
index 8a0ec42f9a..1c178ceb94 100644
--- a/actor-tests/src/test/scala/org/apache/pekko/PekkoExceptionSpec.scala
+++ b/actor-tests/src/test/scala/org/apache/pekko/PekkoExceptionSpec.scala
@@ -36,7 +36,7 @@ class PekkoExceptionSpec extends AnyWordSpec with Matchers {
     }
   }
 
-  def verify(clazz: java.lang.Class[_]): Unit = {
+  def verify(clazz: java.lang.Class[?]): Unit = {
     clazz.getConstructor(Array(classOf[String]): _*)
   }
 }
diff --git a/actor-tests/src/test/scala/org/apache/pekko/actor/AbstractActorPreRestartFinalSpec.scala b/actor-tests/src/test/scala/org/apache/pekko/actor/AbstractActorPreRestartFinalSpec.scala
index e6d3fb6d42..f52b145294 100644
--- a/actor-tests/src/test/scala/org/apache/pekko/actor/AbstractActorPreRestartFinalSpec.scala
+++ b/actor-tests/src/test/scala/org/apache/pekko/actor/AbstractActorPreRestartFinalSpec.scala
@@ -75,7 +75,7 @@ class AbstractActorPreRestartFinalSpec extends PekkoSpec with ImplicitSender {
 
     "be declared final via reflection" in {
       val method = classOf[AbstractActor].getDeclaredMethod(
-        "preRestart", classOf[Throwable], classOf[Option[_]])
+        "preRestart", classOf[Throwable], classOf[Option[?]])
       assert(
         java.lang.reflect.Modifier.isFinal(method.getModifiers),
         "preRestart(Throwable, Option[Any]) should be final in AbstractActor")
@@ -103,7 +103,7 @@ class AbstractActorPreRestartFinalSpec extends PekkoSpec with ImplicitSender {
     "not be overridable in AbstractActor subclass (preRestart with Optional is the extension point)" in {
       // Verify that preRestart(Throwable, Optional[Any]) is NOT final
       val optionalMethod = classOf[AbstractActor].getDeclaredMethod(
-        "preRestart", classOf[Throwable], classOf[Optional[_]])
+        "preRestart", classOf[Throwable], classOf[Optional[?]])
       assert(
         !java.lang.reflect.Modifier.isFinal(optionalMethod.getModifiers),
         "preRestart(Throwable, Optional[Any]) should NOT be final in AbstractActor")
@@ -146,7 +146,7 @@ class AbstractActorPreRestartFinalSpec extends PekkoSpec with ImplicitSender {
 
     "also have final preRestart(Throwable, Option[Any]) (inherited from AbstractActor)" in {
       val method = classOf[UntypedAbstractActor].getMethod(
-        "preRestart", classOf[Throwable], classOf[Option[_]])
+        "preRestart", classOf[Throwable], classOf[Option[?]])
       assert(
         java.lang.reflect.Modifier.isFinal(method.getModifiers),
         "preRestart(Throwable, Option[Any]) should be final in UntypedAbstractActor")
diff --git a/actor-tests/src/test/scala/org/apache/pekko/actor/ActorMailboxSpec.scala b/actor-tests/src/test/scala/org/apache/pekko/actor/ActorMailboxSpec.scala
index d299bc7616..21ad5613dc 100644
--- a/actor-tests/src/test/scala/org/apache/pekko/actor/ActorMailboxSpec.scala
+++ b/actor-tests/src/test/scala/org/apache/pekko/actor/ActorMailboxSpec.scala
@@ -242,7 +242,7 @@ class ActorMailboxSpec(conf: Config) extends PekkoSpec(conf) with DefaultTimeout
 
   def this() = this(ActorMailboxSpec.mailboxConf)
 
-  def checkMailboxQueue(props: Props, name: String, types: Seq[Class[_]]): MessageQueue = {
+  def checkMailboxQueue(props: Props, name: String, types: Seq[Class[?]]): MessageQueue = {
     val actor = system.actorOf(props, name)
 
     actor ! "ping"
diff --git a/actor-tests/src/test/scala/org/apache/pekko/actor/DynamicAccessSpec.scala b/actor-tests/src/test/scala/org/apache/pekko/actor/DynamicAccessSpec.scala
index 2f1bf94099..4517af50c2 100644
--- a/actor-tests/src/test/scala/org/apache/pekko/actor/DynamicAccessSpec.scala
+++ b/actor-tests/src/test/scala/org/apache/pekko/actor/DynamicAccessSpec.scala
@@ -82,7 +82,7 @@ class DynamicAccessSpec extends AnyWordSpec with Matchers with BeforeAndAfterAll
         case Failure(_: NoSuchMethodException) =>
           dynamicAccess
             .createInstanceFor[TestSuperclass](fqcn, immutable.Seq((classOf[String], "string ctor argument")))
-        case f: Failure[_] => f
+        case f: Failure[?] => f
       }
 
   }
diff --git a/actor-tests/src/test/scala/org/apache/pekko/actor/ExtensionSpec.scala b/actor-tests/src/test/scala/org/apache/pekko/actor/ExtensionSpec.scala
index 1586d44683..43c7789082 100644
--- a/actor-tests/src/test/scala/org/apache/pekko/actor/ExtensionSpec.scala
+++ b/actor-tests/src/test/scala/org/apache/pekko/actor/ExtensionSpec.scala
@@ -46,7 +46,7 @@ object InstanceCountingExtension extends ExtensionId[InstanceCountingExtension]
   override def createExtension(system: ExtendedActorSystem): InstanceCountingExtension = {
     new InstanceCountingExtension
   }
-  override def lookup: ExtensionId[_ <: Extension] = this
+  override def lookup: ExtensionId[? <: Extension] = this
 }
 
 class InstanceCountingExtension extends Extension {
diff --git a/actor-tests/src/test/scala/org/apache/pekko/actor/SupervisorHierarchySpec.scala b/actor-tests/src/test/scala/org/apache/pekko/actor/SupervisorHierarchySpec.scala
index 61d75642d7..9e46e814bd 100644
--- a/actor-tests/src/test/scala/org/apache/pekko/actor/SupervisorHierarchySpec.scala
+++ b/actor-tests/src/test/scala/org/apache/pekko/actor/SupervisorHierarchySpec.scala
@@ -929,8 +929,8 @@ class SupervisorHierarchySpec extends PekkoSpec(SupervisorHierarchySpec.config)
 
       fsm ! FSM.SubscribeTransitionCallBack(system.actorOf(Props(new Actor {
         def receive = {
-          case s: FSM.CurrentState[_] => log.info("{}", s)
-          case t: FSM.Transition[_]   => log.info("{}", t)
+          case s: FSM.CurrentState[?] => log.info("{}", s)
+          case t: FSM.Transition[?]   => log.info("{}", t)
         }
       })))
 
diff --git a/actor-tests/src/test/scala/org/apache/pekko/dispatch/MailboxConfigSpec.scala b/actor-tests/src/test/scala/org/apache/pekko/dispatch/MailboxConfigSpec.scala
index ca2039c2ef..4720f9195a 100644
--- a/actor-tests/src/test/scala/org/apache/pekko/dispatch/MailboxConfigSpec.scala
+++ b/actor-tests/src/test/scala/org/apache/pekko/dispatch/MailboxConfigSpec.scala
@@ -128,7 +128,7 @@ abstract class MailboxSpec extends PekkoSpec with BeforeAndAfterAll with BeforeA
   def ensureInitialMailboxState(config: MailboxType, q: MessageQueue): Unit = {
     q should not be null
     q match {
-      case aQueue: BlockingQueue[_] =>
+      case aQueue: BlockingQueue[?] =>
         config match {
           case BoundedMailbox(capacity, _) => aQueue.remainingCapacity should ===(capacity)
           case UnboundedMailbox()          => aQueue.remainingCapacity should ===(Int.MaxValue)
diff --git a/actor-tests/src/test/scala/org/apache/pekko/pattern/StatusReplySpec.scala b/actor-tests/src/test/scala/org/apache/pekko/pattern/StatusReplySpec.scala
index b014ea481c..ec88a1c9f9 100644
--- a/actor-tests/src/test/scala/org/apache/pekko/pattern/StatusReplySpec.scala
+++ b/actor-tests/src/test/scala/org/apache/pekko/pattern/StatusReplySpec.scala
@@ -44,7 +44,7 @@ class StatusReplySpec extends PekkoSpec with ScalaFutures {
       }
     }
     "not throw exception if null" in {
-      (null: StatusReply[_]) match {
+      (null: StatusReply[?]) match {
         case StatusReply.Success(_) => fail()
         case StatusReply.Error(_)   => fail()
         case _                      =>
diff --git a/actor-tests/src/test/scala/org/apache/pekko/serialization/SerializationSetupSpec.scala b/actor-tests/src/test/scala/org/apache/pekko/serialization/SerializationSetupSpec.scala
index 0b4a59bd79..a2853cf155 100644
--- a/actor-tests/src/test/scala/org/apache/pekko/serialization/SerializationSetupSpec.scala
+++ b/actor-tests/src/test/scala/org/apache/pekko/serialization/SerializationSetupSpec.scala
@@ -46,7 +46,7 @@ final class FakeSerializer extends Serializer {
     Array(id.toByte)
   }
 
-  def fromBinary(bytes: Array[Byte], clazz: Option[Class[_]]) = {
+  def fromBinary(bytes: Array[Byte], clazz: Option[Class[?]]) = {
     require(bytes.length == 1)
     val id = bytes(0).toInt
     registry.get(id)
diff --git a/actor-tests/src/test/scala/org/apache/pekko/serialization/SerializeSpec.scala b/actor-tests/src/test/scala/org/apache/pekko/serialization/SerializeSpec.scala
index 165d0e09ba..4248da6a68 100644
--- a/actor-tests/src/test/scala/org/apache/pekko/serialization/SerializeSpec.scala
+++ b/actor-tests/src/test/scala/org/apache/pekko/serialization/SerializeSpec.scala
@@ -389,7 +389,7 @@ class VerifySerializabilitySpec extends PekkoSpec(SerializationTests.verifySeria
 class ReferenceSerializationSpec extends PekkoSpec(SerializationTests.mostlyReferenceSystem) {
 
   val ser = SerializationExtension(system)
-  def serializerMustBe(toSerialize: Class[_], expectedSerializer: Class[_]) =
+  def serializerMustBe(toSerialize: Class[?], expectedSerializer: Class[?]) =
     ser.serializerFor(toSerialize).getClass should ===(expectedSerializer)
 
   "Serialization settings from reference.conf" must {
@@ -428,7 +428,7 @@ class ReferenceSerializationSpec extends PekkoSpec(SerializationTests.mostlyRefe
 class AllowJavaSerializationSpec extends PekkoSpec(SerializationTests.allowJavaSerializationSystem) {
 
   val ser = SerializationExtension(system)
-  def serializerMustBe(toSerialize: Class[_], expectedSerializer: Class[_]) =
+  def serializerMustBe(toSerialize: Class[?], expectedSerializer: Class[?]) =
     ser.serializerFor(toSerialize).getClass should ===(expectedSerializer)
 
   val address = SerializationTests.Address("120", "Monroe Street", "Santa Clara", "95050")
@@ -624,7 +624,7 @@ protected[pekko] class NoopSerializer extends Serializer {
     Array.empty[Byte]
   }
 
-  def fromBinary(bytes: Array[Byte], clazz: Option[Class[_]]): AnyRef = null
+  def fromBinary(bytes: Array[Byte], clazz: Option[Class[?]]): AnyRef = null
 }
 
 protected[pekko] class NoopSerializer2 extends Serializer {
@@ -636,7 +636,7 @@ protected[pekko] class NoopSerializer2 extends Serializer {
     Array.empty[Byte]
   }
 
-  def fromBinary(bytes: Array[Byte], clazz: Option[Class[_]]): AnyRef = null
+  def fromBinary(bytes: Array[Byte], clazz: Option[Class[?]]): AnyRef = null
 }
 
 protected[pekko] class NoopSerializerSameId extends NoopSerializer
@@ -657,7 +657,7 @@ class DeadlockSerializer(system: ExtendedActorSystem) extends Serializer {
 
   def toBinary(o: AnyRef): Array[Byte] = Array.empty[Byte]
 
-  def fromBinary(bytes: Array[Byte], clazz: Option[Class[_]]): AnyRef = null
+  def fromBinary(bytes: Array[Byte], clazz: Option[Class[?]]): AnyRef = null
 }
 
 object ConstructorSerializer {
diff --git a/actor-tests/src/test/scala/org/apache/pekko/util/BoundedBlockingQueueSpec.scala b/actor-tests/src/test/scala/org/apache/pekko/util/BoundedBlockingQueueSpec.scala
index 7cbdadb269..4b92b2c19b 100644
--- a/actor-tests/src/test/scala/org/apache/pekko/util/BoundedBlockingQueueSpec.scala
+++ b/actor-tests/src/test/scala/org/apache/pekko/util/BoundedBlockingQueueSpec.scala
@@ -742,7 +742,7 @@ trait BlockingHelpers {
   /**
    * Check that a Future does not complete within a set timespan.
    */
-  def mustBlockFor(timeout: Span, action: Future[_])(implicit pos: Position): Unit =
+  def mustBlockFor(timeout: Span, action: Future[?])(implicit pos: Position): Unit =
     Exception.ignoring(classOf[TimeoutException]) {
       Await.ready(action, timeout)
       fail("Expected action to block for at least " + timeout.prettyString + " but it completed.")
diff --git a/actor-tests/src/test/scala/org/apache/pekko/util/ByteStringInitializationSpec.scala b/actor-tests/src/test/scala/org/apache/pekko/util/ByteStringInitializationSpec.scala
index b14b5e56f0..071fbea89c 100644
--- a/actor-tests/src/test/scala/org/apache/pekko/util/ByteStringInitializationSpec.scala
+++ b/actor-tests/src/test/scala/org/apache/pekko/util/ByteStringInitializationSpec.scala
@@ -29,7 +29,7 @@ class ByteStringInitializationSpec extends AnyWordSpec with Matchers {
       val cleanCl = new ClassLoader(null) {
         val outerCl = ByteStringInitializationSpec.this.getClass.getClassLoader
         val buffer = new Array[Byte](1000000)
-        override def loadClass(name: String): Class[_] =
+        override def loadClass(name: String): Class[?] =
           if (!name.startsWith("org.apache.pekko")) outerCl.loadClass(name)
           else {
             val classFile = name.replace(".", "/") + ".class"
diff --git a/actor-tests/src/test/scala/org/apache/pekko/util/ByteStringSpec.scala b/actor-tests/src/test/scala/org/apache/pekko/util/ByteStringSpec.scala
index a5066552d8..b5549e744c 100644
--- a/actor-tests/src/test/scala/org/apache/pekko/util/ByteStringSpec.scala
+++ b/actor-tests/src/test/scala/org/apache/pekko/util/ByteStringSpec.scala
@@ -210,7 +210,7 @@ class ByteStringSpec extends AnyWordSpec with Matchers with Checkers {
     (!strict || (bsAIt.toSeq -> bsBIt.toSeq) == (vecAIt.toSeq -> vecBIt.toSeq))
   }
 
-  def likeVecBld(body: Builder[Byte, _] => Unit): Boolean = {
+  def likeVecBld(body: Builder[Byte, ?] => Unit): Boolean = {
     val bsBuilder = ByteString.newBuilder
     val vecBuilder = Vector.newBuilder[Byte]
 
diff --git a/actor-tests/src/test/scala/org/apache/pekko/util/WildcardIndexSpec.scala b/actor-tests/src/test/scala/org/apache/pekko/util/WildcardIndexSpec.scala
index 7757db7daf..9ee1fe4bae 100644
--- a/actor-tests/src/test/scala/org/apache/pekko/util/WildcardIndexSpec.scala
+++ b/actor-tests/src/test/scala/org/apache/pekko/util/WildcardIndexSpec.scala
@@ -20,9 +20,9 @@ class WildcardIndexSpec extends AnyWordSpec with Matchers {
 
   "wildcard index" must {
     "allow to insert elements using Arrays of strings" in {
-      emptyIndex.insert(Array("a", "b"), 1) shouldBe a[WildcardIndex[_]]
-      emptyIndex.insert(Array("a"), 1) shouldBe a[WildcardIndex[_]]
-      emptyIndex.insert(Array.empty[String], 1) shouldBe a[WildcardIndex[_]]
+      emptyIndex.insert(Array("a", "b"), 1) shouldBe a[WildcardIndex[?]]
+      emptyIndex.insert(Array("a"), 1) shouldBe a[WildcardIndex[?]]
+      emptyIndex.insert(Array.empty[String], 1) shouldBe a[WildcardIndex[?]]
     }
 
     "allow to find inserted elements" in {
diff --git a/actor-typed-tests/src/test/scala-3/docs/org/apache/pekko/typed/InteractionPatterns3Spec.scala b/actor-typed-tests/src/test/scala-3/docs/org/apache/pekko/typed/InteractionPatterns3Spec.scala
index cbe5a08dc4..5adef4dd9f 100644
--- a/actor-typed-tests/src/test/scala-3/docs/org/apache/pekko/typed/InteractionPatterns3Spec.scala
+++ b/actor-typed-tests/src/test/scala-3/docs/org/apache/pekko/typed/InteractionPatterns3Spec.scala
@@ -16,7 +16,7 @@ package docs.org.apache.pekko.typed
 import java.net.URI
 
 import scala.concurrent.Future
-import scala.concurrent.duration._
+import scala.concurrent.duration.*
 import scala.util.Failure
 import scala.util.Success
 
@@ -47,7 +47,7 @@ object DummyData3 {
 }
 
 class InteractionPatterns3Spec extends ScalaTestWithActorTestKit with AnyWordSpecLike with LogCapturing {
-  import DummyData3._
+  import DummyData3.*
   private class DummyContext[T](val self: ActorRef[T])
 
   "The interaction patterns docs" must {
@@ -206,7 +206,7 @@ class InteractionPatterns3Spec extends ScalaTestWithActorTestKit with AnyWordSpe
         target: ActorRef[Buncher.Batch],
         after: FiniteDuration,
         maxSize: Int) {
-      import Buncher._
+      import Buncher.*
 
       private def idle(): Behavior[Command] = {
         Behaviors.receiveMessage[Command] { message =>
@@ -222,7 +222,7 @@ class InteractionPatterns3Spec extends ScalaTestWithActorTestKit with AnyWordSpe
             idle()
           case m =>
             val newBuffer = buffer :+ m
-            if (newBuffer.size == maxSize) {
+            if newBuffer.size == maxSize then {
               timers.cancel(TimerKey)
               target ! Batch(newBuffer)
               idle()
@@ -473,7 +473,7 @@ class InteractionPatterns3Spec extends ScalaTestWithActorTestKit with AnyWordSpe
 
       def apply(): Behaviors.Receive[CookieFabric.GiveMeCookies] =
         Behaviors.receiveMessage { message =>
-          if (message.count >= 5)
+          if message.count >= 5 then
             message.replyTo ! InvalidRequest("Too many cookies.")
           else
             message.replyTo ! Cookies(message.count)
@@ -490,14 +490,14 @@ class InteractionPatterns3Spec extends ScalaTestWithActorTestKit with AnyWordSpe
     // #standalone-ask
 
     import org.apache.pekko
-    import pekko.actor.typed.scaladsl.AskPattern._
+    import pekko.actor.typed.scaladsl.AskPattern.*
     import pekko.util.Timeout
 
     // asking someone requires a timeout if the timeout hits without response
     // the ask is failed with a TimeoutException
     implicit val timeout: Timeout = 3.seconds
     // implicit ActorSystem in scope
-    implicit val system: ActorSystem[_] = theSystem
+    implicit val system: ActorSystem[?] = theSystem
 
     val result: Future[CookieFabric.Reply] = cookieFabric.ask(ref => CookieFabric.GiveMeCookies(3, ref))
 
@@ -538,7 +538,7 @@ class InteractionPatterns3Spec extends ScalaTestWithActorTestKit with AnyWordSpe
 
       def apply(): Behaviors.Receive[CookieFabric.GiveMeCookies] =
         Behaviors.receiveMessage { message =>
-          if (message.count >= 5)
+          if message.count >= 5 then
             message.replyTo ! StatusReply.Error("Too many cookies.")
           else
             message.replyTo ! StatusReply.Success(Cookies(message.count))
@@ -555,14 +555,14 @@ class InteractionPatterns3Spec extends ScalaTestWithActorTestKit with AnyWordSpe
     // #standalone-ask-with-status
 
     import org.apache.pekko
-    import pekko.actor.typed.scaladsl.AskPattern._
+    import pekko.actor.typed.scaladsl.AskPattern.*
     import pekko.util.Timeout
 
     // asking someone requires a timeout if the timeout hits without response
     // the ask is failed with a TimeoutException
     implicit val timeout: Timeout = 3.seconds
     // implicit ActorSystem in scope
-    implicit val system: ActorSystem[_] = theSystem
+    implicit val system: ActorSystem[?] = theSystem
 
     val result: Future[CookieFabric.Cookies] = cookieFabric.askWithStatus(ref => CookieFabric.GiveMeCookies(3, ref))
 
@@ -622,7 +622,7 @@ class InteractionPatterns3Spec extends ScalaTestWithActorTestKit with AnyWordSpe
         Behaviors.receive { (context, command) =>
           command match {
             case Update(value, replyTo) =>
-              if (operationsInProgress == MaxOperationsInProgress) {
+              if operationsInProgress == MaxOperationsInProgress then {
                 replyTo ! UpdateFailure(value.id, s"Max $MaxOperationsInProgress concurrent operations supported")
                 Behaviors.same
               } else {
diff --git a/actor-typed-tests/src/test/scala/docs/org/apache/pekko/typed/InteractionPatternsSpec.scala b/actor-typed-tests/src/test/scala/docs/org/apache/pekko/typed/InteractionPatternsSpec.scala
index ee7844e1ff..7db4aa25af 100644
--- a/actor-typed-tests/src/test/scala/docs/org/apache/pekko/typed/InteractionPatternsSpec.scala
+++ b/actor-typed-tests/src/test/scala/docs/org/apache/pekko/typed/InteractionPatternsSpec.scala
@@ -495,7 +495,7 @@ class InteractionPatternsSpec extends ScalaTestWithActorTestKit with AnyWordSpec
     // the ask is failed with a TimeoutException
     implicit val timeout: Timeout = 3.seconds
     // implicit ActorSystem in scope
-    implicit val system: ActorSystem[_] = theSystem
+    implicit val system: ActorSystem[?] = theSystem
 
     val result: Future[CookieFabric.Reply] = cookieFabric.ask(ref => CookieFabric.GiveMeCookies(3, ref))
 
@@ -560,7 +560,7 @@ class InteractionPatternsSpec extends ScalaTestWithActorTestKit with AnyWordSpec
     // the ask is failed with a TimeoutException
     implicit val timeout: Timeout = 3.seconds
     // implicit ActorSystem in scope
-    implicit val system: ActorSystem[_] = theSystem
+    implicit val system: ActorSystem[?] = theSystem
 
     val result: Future[CookieFabric.Cookies] = cookieFabric.askWithStatus(ref => CookieFabric.GiveMeCookies(3, ref))
 
diff --git a/actor-typed-tests/src/test/scala/docs/org/apache/pekko/typed/LoggingDocExamples.scala b/actor-typed-tests/src/test/scala/docs/org/apache/pekko/typed/LoggingDocExamples.scala
index f4e62b3279..ea59d532fb 100644
--- a/actor-typed-tests/src/test/scala/docs/org/apache/pekko/typed/LoggingDocExamples.scala
+++ b/actor-typed-tests/src/test/scala/docs/org/apache/pekko/typed/LoggingDocExamples.scala
@@ -104,7 +104,7 @@ object LoggingDocExamples {
   }
 
   def withMdc(): Unit = {
-    val system: ActorSystem[_] = ???
+    val system: ActorSystem[?] = ???
 
     // #withMdc
     val staticMdc = Map("startTime" -> system.startTime.toString)
@@ -118,7 +118,7 @@ object LoggingDocExamples {
   }
 
   def logging(): Unit = {
-    implicit val system: ActorSystem[_] = ???
+    implicit val system: ActorSystem[?] = ???
     final case class Message(s: String)
     val ref: ActorRef[Message] = ???
 
diff --git a/actor-typed-tests/src/test/scala/docs/org/apache/pekko/typed/StyleGuideDocExamples.scala b/actor-typed-tests/src/test/scala/docs/org/apache/pekko/typed/StyleGuideDocExamples.scala
index 5d950775f7..49d58c530f 100644
--- a/actor-typed-tests/src/test/scala/docs/org/apache/pekko/typed/StyleGuideDocExamples.scala
+++ b/actor-typed-tests/src/test/scala/docs/org/apache/pekko/typed/StyleGuideDocExamples.scala
@@ -311,7 +311,7 @@ object StyleGuideDocExamples {
     // #behavior-factory-method
 
     object Usage {
-      val context: ActorContext[_] = ???
+      val context: ActorContext[?] = ???
       val doneRef: ActorRef[Done] = ???
 
       // #behavior-factory-method-spawn
diff --git a/actor-typed-tests/src/test/scala/docs/org/apache/pekko/typed/extensions/ExtensionDocSpec.scala b/actor-typed-tests/src/test/scala/docs/org/apache/pekko/typed/extensions/ExtensionDocSpec.scala
index d7d6f831e0..7e8b20a20c 100644
--- a/actor-typed-tests/src/test/scala/docs/org/apache/pekko/typed/extensions/ExtensionDocSpec.scala
+++ b/actor-typed-tests/src/test/scala/docs/org/apache/pekko/typed/extensions/ExtensionDocSpec.scala
@@ -33,16 +33,16 @@ class ExpensiveDatabaseConnection {
 //#extension-id
 object DatabasePool extends ExtensionId[DatabasePool] {
   // will only be called once
-  def createExtension(system: ActorSystem[_]): DatabasePool = new DatabasePool(system)
+  def createExtension(system: ActorSystem[?]): DatabasePool = new DatabasePool(system)
 
   // Java API
-  def get(system: ActorSystem[_]): DatabasePool = apply(system)
+  def get(system: ActorSystem[?]): DatabasePool = apply(system)
 }
 //#extension-id
 
 @nowarn
 //#extension
-class DatabasePool(system: ActorSystem[_]) extends Extension {
+class DatabasePool(system: ActorSystem[?]) extends Extension {
   // database configuration can be loaded from config
   // from the actor system
   private val _connection = new ExpensiveDatabaseConnection()
diff --git a/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/AskSpec.scala b/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/AskSpec.scala
index a03dee2841..8800f5d962 100644
--- a/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/AskSpec.scala
+++ b/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/AskSpec.scala
@@ -109,7 +109,7 @@ class AskSpec extends ScalaTestWithActorTestKit("""
 
     "fail the future if the actor doesn't exist" in {
       val noSuchActor: ActorRef[Msg] = system match {
-        case adaptedSys: ActorSystemAdapter[_] =>
+        case adaptedSys: ActorSystemAdapter[?] =>
           import pekko.actor.typed.scaladsl.adapter._
           adaptedSys.system.provider.resolveActorRef("/foo/bar")
         case _ =>
diff --git a/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/ExtensionsSpec.scala b/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/ExtensionsSpec.scala
index 8a6eff66fb..781ea42e07 100644
--- a/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/ExtensionsSpec.scala
+++ b/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/ExtensionsSpec.scala
@@ -32,17 +32,17 @@ import com.typesafe.config.{ Config, ConfigFactory }
 
 class DummyExtension1 extends Extension
 object DummyExtension1 extends ExtensionId[DummyExtension1] {
-  def createExtension(system: ActorSystem[_]) = new DummyExtension1
-  def get(system: ActorSystem[_]): DummyExtension1 = apply(system)
+  def createExtension(system: ActorSystem[?]) = new DummyExtension1
+  def get(system: ActorSystem[?]): DummyExtension1 = apply(system)
 }
-class DummyExtension1Setup(factory: ActorSystem[_] => DummyExtension1)
+class DummyExtension1Setup(factory: ActorSystem[?] => DummyExtension1)
     extends AbstractExtensionSetup[DummyExtension1](DummyExtension1, factory)
 
 class DummyExtension1ViaSetup extends DummyExtension1
 
 class SlowExtension extends Extension
 object SlowExtension extends ExtensionId[SlowExtension] {
-  def createExtension(system: ActorSystem[_]) = {
+  def createExtension(system: ActorSystem[?]) = {
     Thread.sleep(25)
     new SlowExtension
   }
@@ -50,29 +50,29 @@ object SlowExtension extends ExtensionId[SlowExtension] {
 
 class FailingToLoadExtension extends Extension
 object FailingToLoadExtension extends ExtensionId[FailingToLoadExtension] {
-  def createExtension(system: ActorSystem[_]) = {
+  def createExtension(system: ActorSystem[?]) = {
     throw new RuntimeException("I cannot be trusted!")
   }
 }
 
 class MultiExtension(val n: Int) extends Extension
 class MultiExtensionId(n: Int) extends ExtensionId[MultiExtension] {
-  def createExtension(system: ActorSystem[_]): MultiExtension = new MultiExtension(n)
+  def createExtension(system: ActorSystem[?]): MultiExtension = new MultiExtension(n)
 }
 
 object InstanceCountingExtension extends ExtensionId[DummyExtension1] {
   val createCount = new AtomicInteger(0)
-  override def createExtension(system: ActorSystem[_]): DummyExtension1 = {
+  override def createExtension(system: ActorSystem[?]): DummyExtension1 = {
     createCount.addAndGet(1)
     new DummyExtension1
   }
 }
 
 object AccessSystemFromConstructorExtensionId extends ExtensionId[AccessSystemFromConstructor] {
-  override def createExtension(system: ActorSystem[_]): AccessSystemFromConstructor =
+  override def createExtension(system: ActorSystem[?]): AccessSystemFromConstructor =
     new AccessSystemFromConstructor(system)
 }
-class AccessSystemFromConstructor(system: ActorSystem[_]) extends Extension {
+class AccessSystemFromConstructor(system: ActorSystem[?]) extends Extension {
   system.log.info("I log from the constructor")
   system.receptionist ! Receptionist.Find(ServiceKey[String]("i-just-made-it-up"), system.deadLetters) // or touch the receptionist!
 }
@@ -267,7 +267,7 @@ class ExtensionsSpec extends ScalaTestWithActorTestKit with AnyWordSpecLike with
   }
 
   def withEmptyActorSystem[T](name: String, config: Option[Config] = None, setup: Option[ActorSystemSetup] = None)(
-      f: ActorSystem[_] => T): T = {
+      f: ActorSystem[?] => T): T = {
 
     val bootstrap = config match {
       case Some(c) => BootstrapSetup(c)
diff --git a/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/LocalActorRefProviderLogMessagesSpec.scala b/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/LocalActorRefProviderLogMessagesSpec.scala
index c2a05fd6c8..8a5b6fb60b 100644
--- a/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/LocalActorRefProviderLogMessagesSpec.scala
+++ b/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/LocalActorRefProviderLogMessagesSpec.scala
@@ -39,7 +39,7 @@ class LocalActorRefProviderLogMessagesSpec
   "An LocalActorRefProvider" must {
 
     "logs on dedicated 'serialization' logger of unknown path" in {
-      val provider = system.asInstanceOf[ActorSystemAdapter[_]].provider
+      val provider = system.asInstanceOf[ActorSystemAdapter[?]].provider
 
       LoggingTestKit
         .debug("of unknown (invalid) path [dummy/path]")
@@ -50,7 +50,7 @@ class LocalActorRefProviderLogMessagesSpec
     }
 
     "logs on dedicated 'serialization' logger when path doesn't match existing actor" in {
-      val provider = system.asInstanceOf[ActorSystemAdapter[_]].provider
+      val provider = system.asInstanceOf[ActorSystemAdapter[?]].provider
       val invalidPath = provider.rootPath / "user" / "invalid"
 
       LoggingTestKit
@@ -63,10 +63,10 @@ class LocalActorRefProviderLogMessagesSpec
 
     "logs on dedicated 'serialization' logger when of foreign path" in {
 
-      val otherSystem = ActorTestKit("otherSystem").system.asInstanceOf[ActorSystemAdapter[_]]
+      val otherSystem = ActorTestKit("otherSystem").system.asInstanceOf[ActorSystemAdapter[?]]
       val invalidPath = otherSystem.provider.rootPath / "user" / "foo"
 
-      val provider = system.asInstanceOf[ActorSystemAdapter[_]].provider
+      val provider = system.asInstanceOf[ActorSystemAdapter[?]].provider
       try {
         LoggingTestKit
           .debug("Resolve (deserialization) of foreign path [pekko://otherSystem/user/foo]")
diff --git a/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/MailboxSelectorSpec.scala b/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/MailboxSelectorSpec.scala
index 0b7bfbb04f..acdb1ad080 100644
--- a/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/MailboxSelectorSpec.scala
+++ b/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/MailboxSelectorSpec.scala
@@ -44,7 +44,7 @@ class MailboxSelectorSpec extends ScalaTestWithActorTestKit("""
       Behaviors.receiveMessage[WhatsYourMailbox] {
         case WhatsYourMailbox(replyTo) =>
           val mailbox = context match {
-            case adapter: ActorContextAdapter[_] =>
+            case adapter: ActorContextAdapter[?] =>
               adapter.classicActorContext match {
                 case cell: ActorCell =>
                   cell.mailbox.messageQueue
diff --git a/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/SupervisionSpec.scala b/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/SupervisionSpec.scala
index 30c9d61eee..9ced7d2558 100644
--- a/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/SupervisionSpec.scala
+++ b/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/SupervisionSpec.scala
@@ -51,8 +51,8 @@ object SupervisionSpec {
   case object IncrementState extends Command
   case object GetState extends Command
   final case class CreateChild[T](behavior: Behavior[T], name: String) extends Command
-  final case class Watch(ref: ActorRef[_]) extends Command
-  final case class WatchWith(ref: ActorRef[_], cmd: Command) extends Command
+  final case class Watch(ref: ActorRef[?]) extends Command
+  final case class WatchWith(ref: ActorRef[?], cmd: Command) extends Command
 
   sealed trait Event
   final case class Pong(n: Int) extends Event
@@ -1438,7 +1438,7 @@ class SupervisionSpec extends ScalaTestWithActorTestKit("""
 
       LoggingTestKit.error[DeathPactException].expect {
         actor ! "boom"
-        val child = probe.expectMessageType[ActorRef[_]]
+        val child = probe.expectMessageType[ActorRef[?]]
         probe.expectTerminated(child, 3.seconds)
       }
       actor ! "ping"
diff --git a/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/delivery/DurableProducerControllerSpec.scala b/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/delivery/DurableProducerControllerSpec.scala
index f15c014197..429d83fdb6 100644
--- a/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/delivery/DurableProducerControllerSpec.scala
+++ b/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/delivery/DurableProducerControllerSpec.scala
@@ -98,7 +98,7 @@ class DurableProducerControllerSpec
       val durable = TestDurableProducerQueue[TestConsumer.Job](
         Duration.Zero,
         stateHolder,
-        (_: DurableProducerQueue.Command[_]) => false)
+        (_: DurableProducerQueue.Command[?]) => false)
 
       val producerController =
         spawn(ProducerController[TestConsumer.Job](producerId, Some(durable)), s"producerController-$idCount")
@@ -183,7 +183,7 @@ class DurableProducerControllerSpec
         TestDurableProducerQueue[TestConsumer.Job](
           Duration.Zero,
           stateHolder,
-          (_: DurableProducerQueue.Command[_]) => false)
+          (_: DurableProducerQueue.Command[?]) => false)
 
       val producerController =
         spawn(
diff --git a/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/delivery/DurableWorkPullingSpec.scala b/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/delivery/DurableWorkPullingSpec.scala
index 264e4e64eb..0b6ba0d436 100644
--- a/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/delivery/DurableWorkPullingSpec.scala
+++ b/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/delivery/DurableWorkPullingSpec.scala
@@ -168,7 +168,7 @@ class DurableWorkPullingSpec
       val durable = TestDurableProducerQueue[TestConsumer.Job](
         Duration.Zero,
         stateHolder,
-        (_: DurableProducerQueue.Command[_]) => false)
+        (_: DurableProducerQueue.Command[?]) => false)
 
       val workPullingController =
         spawn(
@@ -290,7 +290,7 @@ class DurableWorkPullingSpec
       val durable = TestDurableProducerQueue[TestConsumer.Job](
         Duration.Zero,
         stateHolder,
-        (_: DurableProducerQueue.Command[_]) => false)
+        (_: DurableProducerQueue.Command[?]) => false)
 
       val workPullingController =
         spawn(
diff --git a/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/delivery/ReliableDeliveryRandomSpec.scala b/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/delivery/ReliableDeliveryRandomSpec.scala
index 0aa75315c1..d229e36dbf 100644
--- a/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/delivery/ReliableDeliveryRandomSpec.scala
+++ b/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/delivery/ReliableDeliveryRandomSpec.scala
@@ -106,7 +106,7 @@ class ReliableDeliveryRandomSpec(config: Config)
 
     // RandomFlakyNetwork to simulate lost messages from producerController to consumerController
     val consumerDrop: Any => Double = {
-      case _: ConsumerController.SequencedMessage[_] => consumerDropProbability
+      case _: ConsumerController.SequencedMessage[?] => consumerDropProbability
       case _                                         => 0.0
     }
 
@@ -124,7 +124,7 @@ class ReliableDeliveryRandomSpec(config: Config)
     val producerDrop: Any => Double = {
       case _: ProducerControllerImpl.Request         => producerDropProbability
       case _: ProducerControllerImpl.Resend          => producerDropProbability
-      case _: ProducerController.RegisterConsumer[_] => producerDropProbability
+      case _: ProducerController.RegisterConsumer[?] => producerDropProbability
       case _                                         => 0.0
     }
 
diff --git a/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/internal/ActorSystemSpec.scala b/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/internal/ActorSystemSpec.scala
index 6ea40fabf4..094624d967 100644
--- a/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/internal/ActorSystemSpec.scala
+++ b/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/internal/ActorSystemSpec.scala
@@ -193,7 +193,7 @@ class ActorSystemSpec
           case (context, WhatsYourMailbox(replyTo)) =>
             replyTo !
             context
-              .asInstanceOf[ActorContextImpl[_]]
+              .asInstanceOf[ActorContextImpl[?]]
               .classicActorContext
               .asInstanceOf[Dispatch]
               .mailbox
diff --git a/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/internal/receptionist/LocalReceptionistSpec.scala b/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/internal/receptionist/LocalReceptionistSpec.scala
index fc6f1a82cd..2215a7cf80 100644
--- a/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/internal/receptionist/LocalReceptionistSpec.scala
+++ b/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/internal/receptionist/LocalReceptionistSpec.scala
@@ -208,7 +208,7 @@ class LocalReceptionistSpec extends ScalaTestWithActorTestKit with AnyWordSpecLi
 class LocalReceptionistBehaviorSpec extends AnyWordSpec with Matchers with LogCapturing {
   import LocalReceptionistSpec._
 
-  def assertEmpty(inboxes: TestInbox[_]*): Unit = {
+  def assertEmpty(inboxes: TestInbox[?]*): Unit = {
     inboxes.foreach(i => withClue(s"inbox $i had messages")(i.hasMessages should be(false)))
   }
 
diff --git a/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/scaladsl/MailboxSelectorSpec.scala b/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/scaladsl/MailboxSelectorSpec.scala
index 32f549bc5b..be93d456e5 100644
--- a/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/scaladsl/MailboxSelectorSpec.scala
+++ b/actor-typed-tests/src/test/scala/org/apache/pekko/actor/typed/scaladsl/MailboxSelectorSpec.scala
@@ -74,9 +74,9 @@ class MailboxSelectorSpec(config: Config)
   case class WhatsYourMailbox(replyTo: ActorRef[MessageQueue]) extends Command
   case class WhatsYourDispatcher(replyTo: ActorRef[String]) extends Command
 
-  private def extract[R](context: ActorContext[_], f: ActorCell => R): R = {
+  private def extract[R](context: ActorContext[?], f: ActorCell => R): R = {
     context match {
-      case adapter: ActorContextAdapter[_] =>
+      case adapter: ActorContextAdapter[?] =>
         adapter.classicActorContext match {
           case cell: ActorCell => f(cell)
           case unexpected      => throw new RuntimeException(s"Unexpected: $unexpected")
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/ActorRef.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/ActorRef.scala
index b25f056018..3d369223b9 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/ActorRef.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/ActorRef.scala
@@ -32,7 +32,7 @@ import pekko.annotation.DoNotInherit
  * Not for user extension
  */
 @DoNotInherit
-trait ActorRef[-T] extends RecipientRef[T] with java.lang.Comparable[ActorRef[_]] with java.io.Serializable {
+trait ActorRef[-T] extends RecipientRef[T] with java.lang.Comparable[ActorRef[?]] with java.io.Serializable {
   this: InternalRecipientRef[T] =>
 
   /**
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/ActorRefResolver.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/ActorRefResolver.scala
index aa9769d343..ffa931d938 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/ActorRefResolver.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/ActorRefResolver.scala
@@ -18,9 +18,9 @@ import pekko.actor.{ ActorRefWithCell, ExtendedActorSystem }
 import pekko.annotation.{ DoNotInherit, InternalApi }
 
 object ActorRefResolver extends ExtensionId[ActorRefResolver] {
-  def get(system: ActorSystem[_]): ActorRefResolver = apply(system)
+  def get(system: ActorSystem[?]): ActorRefResolver = apply(system)
 
-  override def createExtension(system: ActorSystem[_]): ActorRefResolver =
+  override def createExtension(system: ActorSystem[?]): ActorRefResolver =
     new ActorRefResolverImpl(system)
 }
 
@@ -53,7 +53,7 @@ abstract class ActorRefResolver extends Extension {
 /**
  * INTERNAL API
  */
-@InternalApi private[pekko] class ActorRefResolverImpl(system: ActorSystem[_]) extends ActorRefResolver {
+@InternalApi private[pekko] class ActorRefResolverImpl(system: ActorSystem[?]) extends ActorRefResolver {
   import pekko.actor.typed.scaladsl.adapter._
 
   private val classicSystem = system.toClassic.asInstanceOf[ExtendedActorSystem]
@@ -93,7 +93,7 @@ abstract class ActorRefResolver extends Extension {
 }
 
 object ActorRefResolverSetup {
-  def apply[T <: Extension](createExtension: ActorSystem[_] => ActorRefResolver): ActorRefResolverSetup =
+  def apply[T <: Extension](createExtension: ActorSystem[?] => ActorRefResolver): ActorRefResolverSetup =
     new ActorRefResolverSetup(sys => createExtension(sys))
 
 }
@@ -103,5 +103,5 @@ object ActorRefResolverSetup {
  * to replace the default implementation of the [[ActorRefResolver]] extension. Intended
  * for tests that need to replace extension with stub/mock implementations.
  */
-final class ActorRefResolverSetup(createExtension: java.util.function.Function[ActorSystem[_], ActorRefResolver])
+final class ActorRefResolverSetup(createExtension: java.util.function.Function[ActorSystem[?], ActorRefResolver])
     extends ExtensionSetup[ActorRefResolver](ActorRefResolver, createExtension)
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/BehaviorInterceptor.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/BehaviorInterceptor.scala
index b25a24a50a..421b2a11fe 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/BehaviorInterceptor.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/BehaviorInterceptor.scala
@@ -102,7 +102,7 @@ object BehaviorInterceptor {
    */
   @DoNotInherit
   trait PreStartTarget[T] {
-    def start(ctx: TypedActorContext[_]): Behavior[T]
+    def start(ctx: TypedActorContext[?]): Behavior[T]
   }
 
   /**
@@ -112,7 +112,7 @@ object BehaviorInterceptor {
    */
   @DoNotInherit
   trait ReceiveTarget[T] {
-    def apply(ctx: TypedActorContext[_], msg: T): Behavior[T]
+    def apply(ctx: TypedActorContext[?], msg: T): Behavior[T]
 
     /**
      * INTERNAL API
@@ -123,7 +123,7 @@ object BehaviorInterceptor {
      * is taking place.
      */
     @InternalApi
-    private[pekko] def signalRestart(ctx: TypedActorContext[_]): Unit
+    private[pekko] def signalRestart(ctx: TypedActorContext[?]): Unit
   }
 
   /**
@@ -133,7 +133,7 @@ object BehaviorInterceptor {
    */
   @DoNotInherit
   trait SignalTarget[T] {
-    def apply(ctx: TypedActorContext[_], signal: Signal): Behavior[T]
+    def apply(ctx: TypedActorContext[?], signal: Signal): Behavior[T]
   }
 
 }
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/Extensions.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/Extensions.scala
index e1cfa9e880..92a6c112e9 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/Extensions.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/Extensions.scala
@@ -120,12 +120,12 @@ abstract class ExtensionId[T <: Extension] {
   /**
    * Create the extension, will be invoked at most one time per actor system where the extension is registered.
    */
-  def createExtension(system: ActorSystem[_]): T
+  def createExtension(system: ActorSystem[?]): T
 
   /**
    * Lookup or create an instance of the extension identified by this id.
    */
-  final def apply(system: ActorSystem[_]): T = system.registerExtension(this)
+  final def apply(system: ActorSystem[?]): T = system.registerExtension(this)
 
   override final def hashCode: Int = System.identityHashCode(this)
   override final def equals(other: Any): Boolean = this eq other.asInstanceOf[AnyRef]
@@ -163,7 +163,7 @@ trait Extensions {
    * Returns whether the specified extension is already registered, this method can potentially block, waiting for the initialization
    * of the payload, if is in the process of registration from another Thread of execution
    */
-  def hasExtension(ext: ExtensionId[_ <: Extension]): Boolean
+  def hasExtension(ext: ExtensionId[? <: Extension]): Boolean
 }
 
 /**
@@ -174,7 +174,7 @@ trait Extensions {
  */
 abstract class ExtensionSetup[T <: Extension](
     val extId: ExtensionId[T],
-    val createExtension: java.util.function.Function[ActorSystem[_], T])
+    val createExtension: java.util.function.Function[ActorSystem[?], T])
     extends Setup
 
 /**
@@ -183,5 +183,5 @@ abstract class ExtensionSetup[T <: Extension](
  * implementation of the extension. Intended for tests that need to replace
  * extension with stub/mock implementations.
  */
-abstract class AbstractExtensionSetup[T <: Extension](extId: ExtensionId[T], createExtension: ActorSystem[_] => T)
+abstract class AbstractExtensionSetup[T <: Extension](extId: ExtensionId[T], createExtension: ActorSystem[?] => T)
     extends ExtensionSetup[T](extId, createExtension.apply)
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/delivery/ConsumerController.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/delivery/ConsumerController.scala
index 94ccc54ed5..72ae6b08ff 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/delivery/ConsumerController.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/delivery/ConsumerController.scala
@@ -204,7 +204,7 @@ object ConsumerController {
      * Scala API: Factory method from config `pekko.reliable-delivery.consumer-controller`
      * of the `ActorSystem`.
      */
-    def apply(system: ActorSystem[_]): Settings =
+    def apply(system: ActorSystem[?]): Settings =
       apply(system.settings.config.getConfig("pekko.reliable-delivery.consumer-controller"))
 
     /**
@@ -223,7 +223,7 @@ object ConsumerController {
      * Java API: Factory method from config `pekko.reliable-delivery.producer-controller`
      * of the `ActorSystem`.
      */
-    def create(system: ActorSystem[_]): Settings =
+    def create(system: ActorSystem[?]): Settings =
       apply(system)
 
     /**
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/delivery/DurableProducerQueue.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/delivery/DurableProducerQueue.scala
index cc51c43095..82665b917f 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/delivery/DurableProducerQueue.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/delivery/DurableProducerQueue.scala
@@ -173,7 +173,7 @@ object DurableProducerQueue {
 
     override def equals(obj: Any): Boolean = {
       obj match {
-        case other: MessageSent[_] =>
+        case other: MessageSent[?] =>
           seqNr == other.seqNr && message == other.message && ack == other.ack &&
           confirmationQualifier ==
             other
@@ -227,7 +227,7 @@ object DurableProducerQueue {
       new MessageSent(seqNr, message, ack, confirmationQualifier, timestampMillis)
 
     def unapply(
-        sent: MessageSent[_]): Option[(SeqNr, MessageOrChunk, Boolean, ConfirmationQualifier, TimestampMillis)] =
+        sent: MessageSent[?]): Option[(SeqNr, MessageOrChunk, Boolean, ConfirmationQualifier, TimestampMillis)] =
       Some((sent.seqNr, sent.message, sent.ack, sent.confirmationQualifier, sent.timestampMillis))
   }
 
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/delivery/ProducerController.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/delivery/ProducerController.scala
index d385bd0d8b..128321a009 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/delivery/ProducerController.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/delivery/ProducerController.scala
@@ -157,7 +157,7 @@ object ProducerController {
      * Scala API: Factory method from config `pekko.reliable-delivery.producer-controller`
      * of the `ActorSystem`.
      */
-    def apply(system: ActorSystem[_]): Settings =
+    def apply(system: ActorSystem[?]): Settings =
       apply(system.settings.config.getConfig("pekko.reliable-delivery.producer-controller"))
 
     /**
@@ -181,7 +181,7 @@ object ProducerController {
      * Java API: Factory method from config `pekko.reliable-delivery.producer-controller`
      * of the `ActorSystem`.
      */
-    def create(system: ActorSystem[_]): Settings =
+    def create(system: ActorSystem[?]): Settings =
       apply(system)
 
     /**
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/delivery/WorkPullingProducerController.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/delivery/WorkPullingProducerController.scala
index 3542f83748..fd3554551f 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/delivery/WorkPullingProducerController.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/delivery/WorkPullingProducerController.scala
@@ -154,7 +154,7 @@ object WorkPullingProducerController {
      * Scala API: Factory method from config `pekko.reliable-delivery.work-pulling.producer-controller`
      * of the `ActorSystem`.
      */
-    def apply(system: ActorSystem[_]): Settings =
+    def apply(system: ActorSystem[?]): Settings =
       apply(system.settings.config.getConfig("pekko.reliable-delivery.work-pulling.producer-controller"))
 
     /**
@@ -172,7 +172,7 @@ object WorkPullingProducerController {
      * Java API: Factory method from config `pekko.reliable-delivery.work-pulling.producer-controller`
      * of the `ActorSystem`.
      */
-    def create(system: ActorSystem[_]): Settings =
+    def create(system: ActorSystem[?]): Settings =
       apply(system)
 
     /**
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/delivery/internal/ConsumerControllerImpl.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/delivery/internal/ConsumerControllerImpl.scala
index 295392b81b..d039a6aff1 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/delivery/internal/ConsumerControllerImpl.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/delivery/internal/ConsumerControllerImpl.scala
@@ -89,7 +89,7 @@ import pekko.util.ConstantFun.scalaIdentityFunction
 
   private case object Retry extends InternalCommand
 
-  private final case class ConsumerTerminated(consumer: ActorRef[_]) extends InternalCommand
+  private final case class ConsumerTerminated(consumer: ActorRef[?]) extends InternalCommand
 
   private final case class State[A](
       producerController: ActorRef[ProducerControllerImpl.InternalCommand],
@@ -170,7 +170,7 @@ import pekko.util.ConstantFun.scalaIdentityFunction
                     }
                     Behaviors.same
 
-                  case _: DeliverThenStop[_] =>
+                  case _: DeliverThenStop[?] =>
                     if (stashBuffer.isEmpty) {
                       Behaviors.stopped
                     } else {
@@ -203,7 +203,7 @@ import pekko.util.ConstantFun.scalaIdentityFunction
 
   private def mdcForMessage(msg: InternalCommand): Map[String, String] = {
     msg match {
-      case seqMsg: SequencedMessage[_] => Map("producerId" -> seqMsg.producerId)
+      case seqMsg: SequencedMessage[?] => Map("producerId" -> seqMsg.producerId)
       case _                           => Map.empty
     }
   }
@@ -225,7 +225,7 @@ import pekko.util.ConstantFun.scalaIdentityFunction
       stopping)
   }
 
-  def enforceLocalConsumer(ref: ActorRef[_]): Unit = {
+  def enforceLocalConsumer(ref: ActorRef[?]): Unit = {
     if (ref.path.address.hasGlobalScope)
       throw new IllegalArgumentException(s"Consumer [$ref] should be local.")
   }
@@ -359,7 +359,7 @@ private class ConsumerControllerImpl[A] private (
         case reg: RegisterToProducerController[A @unchecked] =>
           receiveRegisterToProducerController(s, reg, newState => active(newState))
 
-        case _: DeliverThenStop[_] =>
+        case _: DeliverThenStop[?] =>
           receiveDeliverThenStop(s, newState => active(newState))
 
         case _: UnsealedInternalCommand =>
@@ -484,7 +484,7 @@ private class ConsumerControllerImpl[A] private (
         case reg: RegisterToProducerController[A @unchecked] =>
           receiveRegisterToProducerController(s, reg, newState => active(newState))
 
-        case _: DeliverThenStop[_] =>
+        case _: DeliverThenStop[?] =>
           receiveDeliverThenStop(s, newState => resending(newState))
 
         case _: UnsealedInternalCommand =>
@@ -604,7 +604,7 @@ private class ConsumerControllerImpl[A] private (
               scalaIdentityFunction)
           }
 
-        case msg: SequencedMessage[_] =>
+        case msg: SequencedMessage[?] =>
           flightRecorder.consumerReceivedPreviousInProgress(msg.producerId, msg.seqNr, stashBuffer.size + 1)
           val expectedSeqNr = seqMsg.seqNr + stashBuffer.size + 1
           if (msg.seqNr < expectedSeqNr && msg.producerController == seqMsg.producerController) {
@@ -642,7 +642,7 @@ private class ConsumerControllerImpl[A] private (
         case reg: RegisterToProducerController[A @unchecked] =>
           receiveRegisterToProducerController(s, reg, newState => waitingForConfirmation(newState, seqMsg))
 
-        case _: DeliverThenStop[_] =>
+        case _: DeliverThenStop[?] =>
           receiveDeliverThenStop(s, newState => waitingForConfirmation(newState, seqMsg))
 
         case _: UnsealedInternalCommand =>
@@ -708,7 +708,7 @@ private class ConsumerControllerImpl[A] private (
     }
   }
 
-  private def receiveConsumerTerminated(c: ActorRef[_]): Behavior[InternalCommand] = {
+  private def receiveConsumerTerminated(c: ActorRef[?]): Behavior[InternalCommand] = {
     context.log.debug("Consumer [{}] terminated.", c)
     Behaviors.stopped
   }
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/delivery/internal/ProducerControllerImpl.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/delivery/internal/ProducerControllerImpl.scala
index 8a9c2e543a..46860168b7 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/delivery/internal/ProducerControllerImpl.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/delivery/internal/ProducerControllerImpl.scala
@@ -344,7 +344,7 @@ object ProducerControllerImpl {
     }
   }
 
-  def enforceLocalProducer(ref: ActorRef[_]): Unit = {
+  def enforceLocalProducer(ref: ActorRef[?]): Unit = {
     if (ref.path.address.hasGlobalScope)
       throw new IllegalArgumentException(s"Consumer [$ref] should be local.")
   }
@@ -807,7 +807,7 @@ private class ProducerControllerImpl[A: ClassTag](
           active(s.copy(remainingChunks = chunks, storeMessageSentInProgress = seqMsg.seqNr))
         }
 
-      case StoreMessageSentCompleted(sent: MessageSent[_]) =>
+      case StoreMessageSentCompleted(sent: MessageSent[?]) =>
         receiveStoreMessageSentCompleted(sent.seqNr)
 
       case f: StoreMessageSentFailed[A @unchecked] =>
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/eventstream/EventStream.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/eventstream/EventStream.scala
index 2772dfb339..51f6ccd18d 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/eventstream/EventStream.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/eventstream/EventStream.scala
@@ -64,7 +64,7 @@ object EventStream {
     /**
      * INTERNAL API
      */
-    @InternalApi private[pekko] def topic: Class[_] = classTag.runtimeClass
+    @InternalApi private[pekko] def topic: Class[?] = classTag.runtimeClass
   }
 
   /**
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/ActorContextImpl.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/ActorContextImpl.scala
index 3c267d9f0d..6f2e98b962 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/ActorContextImpl.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/ActorContextImpl.scala
@@ -48,7 +48,7 @@ import org.slf4j.LoggerFactory
   // single context for logging as there are a few things that are initialized
   // together that we can cache as long as the actor is alive
   object LoggingContext {
-    def apply(logger: Logger, tags: Set[String], ctx: ActorContextImpl[_]): LoggingContext = {
+    def apply(logger: Logger, tags: Set[String], ctx: ActorContextImpl[?]): LoggingContext = {
       val tagsString =
         // "" means no tags
         if (tags.isEmpty) ""
@@ -61,7 +61,7 @@ import org.slf4j.LoggerFactory
 
       val pekkoAddress =
         ctx.system match {
-          case adapter: ActorSystemAdapter[_] => adapter.provider.addressString
+          case adapter: ActorSystemAdapter[?] => adapter.provider.addressString
           case _                              => Address("pekko", ctx.system.name).toString
         }
 
@@ -105,7 +105,7 @@ import org.slf4j.LoggerFactory
   private var _logging: OptionVal[LoggingContext] = OptionVal.None
 
   private var messageAdapterRef: OptionVal[ActorRef[Any]] = OptionVal.None
-  private var _messageAdapters: List[(Class[_], Any => T)] = Nil
+  private var _messageAdapters: List[(Class[?], Any => T)] = Nil
   private var _timer: OptionVal[TimerSchedulerCrossDslSupport[T]] = OptionVal.None
 
   // _currentActorThread is on purpose not volatile. Used from `checkCurrentActorThread`.
@@ -164,7 +164,7 @@ import org.slf4j.LoggerFactory
     _logging match {
       case OptionVal.Some(l) => l
       case _                 =>
-        val logClass = LoggerClass.detectLoggerClassFromStack(classOf[Behavior[_]])
+        val logClass = LoggerClass.detectLoggerClassFromStack(classOf[Behavior[?]])
         val logger = LoggerFactory.getLogger(logClass.getName)
         val l = LoggingContext(logger, classicActorContext.props.deploy.tags, this)
         _logging = OptionVal.Some(l)
@@ -186,7 +186,7 @@ import org.slf4j.LoggerFactory
     _logging = OptionVal.Some(loggingContext().withLogger(LoggerFactory.getLogger(name)))
   }
 
-  override def setLoggerName(clazz: Class[_]): Unit =
+  override def setLoggerName(clazz: Class[?]): Unit =
     setLoggerName(clazz.getName)
 
   def hasCustomLoggerName: Boolean = loggingContext().hasCustomName
@@ -238,7 +238,7 @@ import org.slf4j.LoggerFactory
     ask(target, createRequest) {
       case Success(StatusReply.Success(t: Res)) => mapResponse(Success(t))
       case Success(StatusReply.Error(why))      => mapResponse(Failure(why))
-      case fail: Failure[_]                     => mapResponse(fail.asInstanceOf[Failure[Res]])
+      case fail: Failure[?]                     => mapResponse(fail.asInstanceOf[Failure[Res]])
       case _                                    => throw new RuntimeException() // won't happen, compiler exhaustiveness check pleaser
     }
 
@@ -335,7 +335,7 @@ import org.slf4j.LoggerFactory
   /**
    * INTERNAL API
    */
-  @InternalApi private[pekko] def messageAdapters: List[(Class[_], Any => T)] = _messageAdapters
+  @InternalApi private[pekko] def messageAdapters: List[(Class[?], Any => T)] = _messageAdapters
 
   /**
    * INTERNAL API
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/ActorFlightRecorder.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/ActorFlightRecorder.scala
index 371ae67c83..f6bdfd77cb 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/ActorFlightRecorder.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/ActorFlightRecorder.scala
@@ -25,7 +25,7 @@ import pekko.util.FlightRecorderLoader
 @InternalApi
 object ActorFlightRecorder extends ExtensionId[ActorFlightRecorder] {
 
-  override def createExtension(system: ActorSystem[_]): ActorFlightRecorder =
+  override def createExtension(system: ActorSystem[?]): ActorFlightRecorder =
     FlightRecorderLoader.load[ActorFlightRecorder](
       system,
       "org.apache.pekko.actor.typed.internal.jfr.JFRActorFlightRecorder",
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/ActorRefImpl.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/ActorRefImpl.scala
index 33dd5ae1de..89a3772c77 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/ActorRefImpl.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/ActorRefImpl.scala
@@ -33,7 +33,7 @@ private[pekko] trait ActorRefImpl[-T] extends ActorRef[T] { this: InternalRecipi
   /**
    * Comparison takes path and the unique id of the actor cell into account.
    */
-  final override def compareTo(other: ActorRef[_]) = {
+  final override def compareTo(other: ActorRef[?]) = {
     val x = this.path.compareTo(other.path)
     if (x == 0) if (this.path.uid < other.path.uid) -1 else if (this.path.uid == other.path.uid) 0 else 1
     else x
@@ -45,7 +45,7 @@ private[pekko] trait ActorRefImpl[-T] extends ActorRef[T] { this: InternalRecipi
    * Equals takes path and the unique id of the actor cell into account.
    */
   final override def equals(that: Any): Boolean = that match {
-    case other: ActorRef[_] => path.uid == other.path.uid && path == other.path
+    case other: ActorRef[?] => path.uid == other.path.uid && path == other.path
     case _                  => false
   }
 
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/EventStreamExtension.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/EventStreamExtension.scala
index 059f857663..899b951465 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/EventStreamExtension.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/EventStreamExtension.scala
@@ -27,11 +27,11 @@ import pekko.annotation.InternalApi
  *
  * It is used as an extension to ensure a single instance per actor system.
  */
-@InternalApi private[pekko] final class EventStreamExtension(actorSystem: ActorSystem[_]) extends Extension {
+@InternalApi private[pekko] final class EventStreamExtension(actorSystem: ActorSystem[?]) extends Extension {
   val ref: ActorRef[EventStream.Command] =
     actorSystem.internalSystemActorOf(EventStreamAdapter.behavior, "eventstream", Props.empty)
 }
 
 private[pekko] object EventStreamExtension extends ExtensionId[EventStreamExtension] {
-  override def createExtension(system: ActorSystem[_]): EventStreamExtension = new EventStreamExtension(system)
+  override def createExtension(system: ActorSystem[?]): EventStreamExtension = new EventStreamExtension(system)
 }
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/ExtensionsImpl.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/ExtensionsImpl.scala
index 027eb3b185..5339545125 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/ExtensionsImpl.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/ExtensionsImpl.scala
@@ -30,9 +30,9 @@ import pekko.annotation.InternalApi
  * Actor system extensions registry
  */
 @InternalApi
-private[pekko] trait ExtensionsImpl extends Extensions { self: ActorSystem[_] with InternalRecipientRef[_] =>
+private[pekko] trait ExtensionsImpl extends Extensions { self: ActorSystem[?] with InternalRecipientRef[?] =>
 
-  private val extensions = new ConcurrentHashMap[ExtensionId[_], AnyRef]
+  private val extensions = new ConcurrentHashMap[ExtensionId[?], AnyRef]
 
   /**
    * Hook for ActorSystem to load extensions on startup
@@ -54,7 +54,7 @@ private[pekko] trait ExtensionsImpl extends Extensions { self: ActorSystem[_] wi
       }
 
       idTry match {
-        case Success(id: ExtensionId[_]) => registerExtension(id)
+        case Success(id: ExtensionId[?]) => registerExtension(id)
         case Success(_)                  =>
           if (!throwOnLoadFail) log.error("[{}] is not an 'ExtensionId', skipping...", extensionIdFQCN)
           else throw new RuntimeException(s"[$extensionIdFQCN] is not an 'ExtensionId'")
@@ -68,14 +68,14 @@ private[pekko] trait ExtensionsImpl extends Extensions { self: ActorSystem[_] wi
 
   private def idFromJavaSingletonAccessor(extensionIdFQCN: String): Try[ExtensionId[Extension]] =
     dynamicAccess.getClassFor[ExtensionId[Extension]](extensionIdFQCN).flatMap[ExtensionId[Extension]] {
-      (clazz: Class[_]) =>
+      (clazz: Class[?]) =>
         Try {
           val singletonAccessor = clazz.getDeclaredMethod("getInstance")
           singletonAccessor.invoke(null).asInstanceOf[ExtensionId[Extension]]
         }
     }
 
-  final override def hasExtension(ext: ExtensionId[_ <: Extension]): Boolean = findExtension(ext) != null
+  final override def hasExtension(ext: ExtensionId[? <: Extension]): Boolean = findExtension(ext) != null
 
   final override def extension[T <: Extension](ext: ExtensionId[T]): T = findExtension(ext) match {
     case null => throw new IllegalArgumentException(s"Trying to get non-registered extension [$ext]")
@@ -96,7 +96,7 @@ private[pekko] trait ExtensionsImpl extends Extensions { self: ActorSystem[_] wi
           // Create and initialize the extension, first look for ExtensionSetup
           val instance = self.settings.setup.setups
             .collectFirst {
-              case (_, extSetup: ExtensionSetup[_]) if extSetup.extId == ext => extSetup.createExtension(self)
+              case (_, extSetup: ExtensionSetup[?]) if extSetup.extId == ext => extSetup.createExtension(self)
             }
             .getOrElse(ext.createExtension(self))
           instance match {
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/InterceptorImpl.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/InterceptorImpl.scala
index 4838105e3c..c5a0fa3c69 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/InterceptorImpl.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/InterceptorImpl.scala
@@ -56,24 +56,24 @@ private[pekko] final class InterceptorImpl[O, I](
   import BehaviorInterceptor._
 
   private val preStartTarget: PreStartTarget[I] = new PreStartTarget[I] {
-    override def start(ctx: TypedActorContext[_]): Behavior[I] = {
+    override def start(ctx: TypedActorContext[?]): Behavior[I] = {
       Behavior.start[I](nestedBehavior, ctx.asInstanceOf[TypedActorContext[I]])
     }
     override def toString: String = s"PreStartTarget($nestedBehavior)"
   }
 
   private val receiveTarget: ReceiveTarget[I] = new ReceiveTarget[I] {
-    override def apply(ctx: TypedActorContext[_], msg: I): Behavior[I] =
+    override def apply(ctx: TypedActorContext[?], msg: I): Behavior[I] =
       Behavior.interpretMessage(nestedBehavior, ctx.asInstanceOf[TypedActorContext[I]], msg)
 
-    override def signalRestart(ctx: TypedActorContext[_]): Unit =
+    override def signalRestart(ctx: TypedActorContext[?]): Unit =
       Behavior.interpretSignal(nestedBehavior, ctx.asInstanceOf[TypedActorContext[I]], PreRestart)
 
     override def toString: String = s"ReceiveTarget($nestedBehavior)"
   }
 
   private val signalTarget = new SignalTarget[I] {
-    override def apply(ctx: TypedActorContext[_], signal: Signal): Behavior[I] =
+    override def apply(ctx: TypedActorContext[?], signal: Signal): Behavior[I] =
       Behavior.interpretSignal(nestedBehavior, ctx.asInstanceOf[TypedActorContext[I]], signal)
     override def toString: String = s"SignalTarget($nestedBehavior)"
   }
@@ -111,7 +111,7 @@ private[pekko] final class InterceptorImpl[O, I](
     } else {
       // returned behavior could be nested in setups, so we need to start before we deduplicate
       val duplicateInterceptExists = Behavior.existsInStack(started) {
-        case i: InterceptorImpl[_, _]
+        case i: InterceptorImpl[?, ?]
             if interceptor.isSame(i.interceptor.asInstanceOf[BehaviorInterceptor[Any, Any]]) =>
           true
         case _ => false
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/LoggerClass.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/LoggerClass.scala
index a47ba35479..94a150a0d6 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/LoggerClass.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/LoggerClass.scala
@@ -29,17 +29,17 @@ private[pekko] object LoggerClass {
   private val OPTIONS: java.util.Set[StackWalker.Option] = java.util.Set.of(
     StackWalker.Option.RETAIN_CLASS_REFERENCE, StackWalker.Option.SHOW_HIDDEN_FRAMES)
   private val CLASS_STACK_WALKER: java.util.function.Function[
-    java.util.stream.Stream[StackWalker.StackFrame], Array[Class[_]]] =
+    java.util.stream.Stream[StackWalker.StackFrame], Array[Class[?]]] =
     (frames: java.util.stream.Stream[StackWalker.StackFrame]) =>
       frames.map(frame => frame.getDeclaringClass)
-        .toArray[Class[_]]((size: Int) => new Array[Class[_]](size))
+        .toArray[Class[?]]((size: Int) => new Array[Class[?]](size))
 
-  private def getClassStack: Array[Class[_]] = StackWalker.getInstance(OPTIONS).walk(CLASS_STACK_WALKER)
+  private def getClassStack: Array[Class[?]] = StackWalker.getInstance(OPTIONS).walk(CLASS_STACK_WALKER)
 
   /**
    * Try to extract a logger class from the call stack, if not possible the provided default is used
    */
-  def detectLoggerClassFromStack(default: Class[_], additionalPrefixesToSkip: List[String] = Nil): Class[_] = {
+  def detectLoggerClassFromStack(default: Class[?], additionalPrefixesToSkip: List[String] = Nil): Class[?] = {
     try {
       def skip(name: String): Boolean = {
         def loop(skipList: List[String]): Boolean = skipList match {
@@ -53,7 +53,7 @@ private[pekko] object LoggerClass {
       }
 
       val trace = getClassStack
-      var suitableClass: OptionVal[Class[_]] = OptionVal.None
+      var suitableClass: OptionVal[Class[?]] = OptionVal.None
       var idx = 1 // skip this method/class and right away
       while (suitableClass.isEmpty && idx < trace.length) {
         val clazz = trace(idx)
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/MiscMessageSerializer.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/MiscMessageSerializer.scala
index 45b9f1be22..5de797568f 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/MiscMessageSerializer.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/MiscMessageSerializer.scala
@@ -34,13 +34,13 @@ import pekko.serialization.{ BaseSerializer, SerializerWithStringManifest }
   private val ActorRefManifest = "a"
 
   def manifest(o: AnyRef): String = o match {
-    case _: ActorRef[_] => ActorRefManifest
+    case _: ActorRef[?] => ActorRefManifest
     case _              =>
       throw new IllegalArgumentException(s"Can't serialize object of type ${o.getClass} in [${getClass.getName}]")
   }
 
   def toBinary(o: AnyRef): Array[Byte] = o match {
-    case ref: ActorRef[_] => resolver.toSerializationFormat(ref).getBytes(StandardCharsets.UTF_8)
+    case ref: ActorRef[?] => resolver.toSerializationFormat(ref).getBytes(StandardCharsets.UTF_8)
     case _                =>
       throw new IllegalArgumentException(s"Cannot serialize object of type [${o.getClass.getName}]")
   }
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/PoisonPill.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/PoisonPill.scala
index 66a74f76ad..76372e913e 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/PoisonPill.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/PoisonPill.scala
@@ -61,5 +61,5 @@ import pekko.annotation.InternalApi
 
   override def isSame(other: BehaviorInterceptor[Any, Any]): Boolean =
     // only one interceptor per behavior stack is needed
-    other.isInstanceOf[PoisonPillInterceptor[_]]
+    other.isInstanceOf[PoisonPillInterceptor[?]]
 }
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/Supervision.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/Supervision.scala
index d6f2e67de8..19fc70b43b 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/Supervision.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/Supervision.scala
@@ -44,9 +44,9 @@ import org.slf4j.event.Level
  */
 @InternalApi private[pekko] object Supervisor {
   def apply[T, Thr <: Throwable: ClassTag](initialBehavior: Behavior[T], strategy: SupervisorStrategy): Behavior[T] = {
-    if (initialBehavior.isInstanceOf[scaladsl.AbstractBehavior[_]] ||
+    if (initialBehavior.isInstanceOf[scaladsl.AbstractBehavior[?]] ||
       initialBehavior
-        .isInstanceOf[javadsl.AbstractBehavior[_]]) {
+        .isInstanceOf[javadsl.AbstractBehavior[?]]) {
       throw new IllegalArgumentException(
         "The supervised Behavior must not be a AbstractBehavior instance directly," +
         "because a different instance should be created when it is restarted. Wrap in Behaviors.setup.")
@@ -79,7 +79,7 @@ private abstract class AbstractSupervisor[I, Thr <: Throwable](strategy: Supervi
 
   override def isSame(other: BehaviorInterceptor[Any, Any]): Boolean = {
     other match {
-      case as: AbstractSupervisor[_, _] if throwableClass == as.throwableClass => true
+      case as: AbstractSupervisor[?, ?] if throwableClass == as.throwableClass => true
       case _                                                                   => false
     }
   }
@@ -96,10 +96,10 @@ private abstract class AbstractSupervisor[I, Thr <: Throwable](strategy: Supervi
     } catch handleSignalException(ctx, target)
   }
 
-  def log(ctx: TypedActorContext[_], t: Throwable): Unit =
+  def log(ctx: TypedActorContext[?], t: Throwable): Unit =
     log(ctx, t, errorCount = -1)
 
-  def log(ctx: TypedActorContext[_], t: Throwable, errorCount: Int): Unit = {
+  def log(ctx: TypedActorContext[?], t: Throwable, errorCount: Int): Unit = {
     if (strategy.loggingEnabled) {
       val unwrapped = UnstashException.unwrap(t)
       val errorCountStr = if (errorCount >= 0) s" [$errorCount]" else ""
@@ -119,7 +119,7 @@ private abstract class AbstractSupervisor[I, Thr <: Throwable](strategy: Supervi
     }
   }
 
-  def dropped(ctx: TypedActorContext[_], signalOrMessage: Any): Unit = {
+  def dropped(ctx: TypedActorContext[?], signalOrMessage: Any): Unit = {
     import pekko.actor.typed.scaladsl.adapter._
     ctx.asScala.system.toClassic.eventStream
       .publish(Dropped(signalOrMessage, s"Stash is full in [${getClass.getSimpleName}]", ctx.asScala.self.toClassic))
@@ -198,10 +198,10 @@ private object RestartSupervisor {
     }
   }
 
-  final case class ScheduledRestart(owner: RestartSupervisor[_, _ <: Throwable])
+  final case class ScheduledRestart(owner: RestartSupervisor[?, ? <: Throwable])
       extends Signal
       with DeadLetterSuppression
-  final case class ResetRestartCount(current: Int, owner: RestartSupervisor[_, _ <: Throwable])
+  final case class ResetRestartCount(current: Int, owner: RestartSupervisor[?, ? <: Throwable])
       extends Signal
       with DeadLetterSuppression
 }
@@ -421,7 +421,7 @@ private class RestartSupervisor[T, Thr <: Throwable: ClassTag](initial: Behavior
         })
   }
 
-  private def stopChildren(ctx: TypedActorContext[_], children: Set[ActorRef[Nothing]]): Unit = {
+  private def stopChildren(ctx: TypedActorContext[?], children: Set[ActorRef[Nothing]]): Unit = {
     children.foreach { child =>
       // Unwatch in case the actor being restarted used watchWith to watch the child.
       ctx.asScala.unwatch(child)
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/WithMdcBehaviorInterceptor.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/WithMdcBehaviorInterceptor.scala
index 5f1ea08f53..251debe7b6 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/WithMdcBehaviorInterceptor.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/WithMdcBehaviorInterceptor.scala
@@ -59,7 +59,7 @@ import org.slf4j.MDC
     // so we need to look through the stack and eliminate any MCD already existing
     def loop(next: Behavior[T]): Behavior[T] = {
       next match {
-        case i: InterceptorImpl[_, T @unchecked]
+        case i: InterceptorImpl[?, T @unchecked]
             if i.interceptor.isSame(this.asInstanceOf[BehaviorInterceptor[Any, Any]]) =>
           // eliminate that interceptor
           loop(i.nestedBehavior)
@@ -83,7 +83,7 @@ import org.slf4j.MDC
 
   // in the normal case, a new withMDC replaces the previous one
   override def isSame(other: BehaviorInterceptor[Any, Any]): Boolean = other match {
-    case _: WithMdcBehaviorInterceptor[_] => true
+    case _: WithMdcBehaviorInterceptor[?] => true
     case _                                => false
   }
 
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/adapter/ActorAdapter.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/adapter/ActorAdapter.scala
index 872cfc4298..5b7b131b6c 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/adapter/ActorAdapter.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/adapter/ActorAdapter.scala
@@ -180,7 +180,7 @@ import pekko.util.OptionVal
   }
 
   private def adaptAndHandle(msg: Any): Unit = {
-    @tailrec def handle(adapters: List[(Class[_], Any => T)]): Unit = {
+    @tailrec def handle(adapters: List[(Class[?], Any => T)]): Unit = {
       adapters match {
         case Nil =>
           // no adapter function registered for message class
@@ -240,7 +240,7 @@ import pekko.util.OptionVal
           case _ =>
             val isTypedActor = sender() match {
               case afwc: ActorRefWithCell =>
-                afwc.underlying.props.producer.actorClass == classOf[ActorAdapter[_]]
+                afwc.underlying.props.producer.actorClass == classOf[ActorAdapter[?]]
               case _ =>
                 false
             }
@@ -326,7 +326,7 @@ import pekko.util.OptionVal
     try {
       ctx.cancelAllTimers()
       behavior match {
-        case _: DeferredBehavior[_] =>
+        case _: DeferredBehavior[?] =>
         // Do not undefer a DeferredBehavior as that may cause creation side-effects, which we do not want on termination.
         case b => Behavior.interpretSignal(b, ctx, PostStop)
       }
@@ -352,7 +352,7 @@ import pekko.util.OptionVal
     // first pass the signal to the previous behavior, so that it and potential interceptors
     // will get the PostStop signal, unless it is deferred, we don't start a behavior while stopping
     lastBehavior match {
-      case _: DeferredBehavior[_] => // no starting of behaviors on actor stop
+      case _: DeferredBehavior[?] => // no starting of behaviors on actor stop
       case nonDeferred            => Behavior.interpretSignal(nonDeferred, ctx, PostStop)
     }
     // and then to the potential stop hook, which can have a call back or not
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/adapter/ActorContextAdapter.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/adapter/ActorContextAdapter.scala
index 4a522b33c2..45b256b107 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/adapter/ActorContextAdapter.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/adapter/ActorContextAdapter.scala
@@ -26,19 +26,19 @@ import pekko.util.OptionVal
 @InternalApi
 private[pekko] object ActorContextAdapter {
 
-  private def toClassicImp[U](context: TypedActorContext[_]): classic.ActorContext =
+  private def toClassicImp[U](context: TypedActorContext[?]): classic.ActorContext =
     context match {
-      case adapter: ActorContextAdapter[_] => adapter.classicActorContext
+      case adapter: ActorContextAdapter[?] => adapter.classicActorContext
       case _                               =>
         throw new UnsupportedOperationException(
           "Only adapted classic ActorContext permissible " +
           s"($context of class ${context.getClass.getName})")
     }
 
-  def toClassic[U](context: scaladsl.ActorContext[_]): classic.ActorContext =
+  def toClassic[U](context: scaladsl.ActorContext[?]): classic.ActorContext =
     toClassicImp(context)
 
-  def toClassic[U](context: javadsl.ActorContext[_]): classic.ActorContext =
+  def toClassic[U](context: javadsl.ActorContext[?]): classic.ActorContext =
     toClassicImp(context)
 }
 
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/adapter/ActorRefAdapter.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/adapter/ActorRefAdapter.scala
index 5b8986c8ad..05e76a921d 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/adapter/ActorRefAdapter.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/adapter/ActorRefAdapter.scala
@@ -59,8 +59,8 @@ private[pekko] object ActorRefAdapter {
 
   def toClassic[U](ref: ActorRef[U]): pekko.actor.InternalActorRef =
     ref match {
-      case adapter: ActorRefAdapter[_]    => adapter.classicRef
-      case adapter: ActorSystemAdapter[_] => adapter.system.guardian
+      case adapter: ActorRefAdapter[?]    => adapter.classicRef
+      case adapter: ActorSystemAdapter[?] => adapter.system.guardian
       case _                              =>
         throw new UnsupportedOperationException(
           "Only adapted classic ActorRefs permissible " +
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/adapter/ActorSystemAdapter.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/adapter/ActorSystemAdapter.scala
index 7c9bfb6ca8..8a599493eb 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/adapter/ActorSystemAdapter.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/adapter/ActorSystemAdapter.scala
@@ -105,7 +105,7 @@ import org.slf4j.{ Logger, LoggerFactory }
   }
   override def dynamicAccess: classic.DynamicAccess = system.dynamicAccess
   implicit override def executionContext: scala.concurrent.ExecutionContextExecutor = classicSystem.dispatcher
-  override val log: Logger = LoggerFactory.getLogger(classOf[ActorSystem[_]])
+  override val log: Logger = LoggerFactory.getLogger(classOf[ActorSystem[?]])
   override def logConfiguration(): Unit = classicSystem.logConfiguration()
   override def name: String = classicSystem.name
   override val scheduler: Scheduler = new SchedulerAdapter(classicSystem.scheduler)
@@ -147,9 +147,9 @@ private[pekko] object ActorSystemAdapter {
       case system: classic.ActorSystemImpl =>
         // Optimization to cut out going through adapter lookup if possible
         system.typedSystem match {
-          case OptionVal.Some(typedSystem: ActorSystem[_]) => typedSystem
+          case OptionVal.Some(typedSystem: ActorSystem[?]) => typedSystem
           case _                                           =>
-            val typedSystem: ActorSystem[_] = AdapterExtension(system).adapter
+            val typedSystem: ActorSystem[?] = AdapterExtension(system).adapter
             system.typedSystem = OptionVal.Some(typedSystem)
             typedSystem
         }
@@ -182,10 +182,10 @@ private[pekko] object ActorSystemAdapter {
   }
 
   object LoadTypedExtensions extends classic.ExtensionId[LoadTypedExtensions] with classic.ExtensionIdProvider {
-    override def lookup: actor.ExtensionId[_ <: actor.Extension] = this
+    override def lookup: actor.ExtensionId[? <: actor.Extension] = this
     override def createExtension(system: ExtendedActorSystem): LoadTypedExtensions =
       new LoadTypedExtensions(system)
   }
 
-  def toClassic[U](sys: ActorSystem[_]): classic.ActorSystem = sys.classicSystem
+  def toClassic[U](sys: ActorSystem[?]): classic.ActorSystem = sys.classicSystem
 }
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/adapter/PropsAdapter.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/adapter/PropsAdapter.scala
index 40e44ef921..8847ebb0da 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/adapter/PropsAdapter.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/adapter/PropsAdapter.scala
@@ -66,7 +66,7 @@ import pekko.dispatch.Mailboxes
     new pekko.actor.Props(
       deploy,
       TypedCreatorFunctionConsumerClazz,
-      classOf[ActorAdapter[_]] :: (() => new ActorAdapter(behavior(), rethrowTypedFailure)) :: Nil)
+      classOf[ActorAdapter[?]] :: (() => new ActorAdapter(behavior(), rethrowTypedFailure)) :: Nil)
   }
 
 }
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/receptionist/LocalReceptionist.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/receptionist/LocalReceptionist.scala
index 5cc5a0b1d8..38269c7e42 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/receptionist/LocalReceptionist.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/receptionist/LocalReceptionist.scala
@@ -71,9 +71,9 @@ private[pekko] object LocalReceptionist extends ReceptionistBehaviorProvider {
    */
   private final case class State(
       services: TypedMultiMap[AbstractServiceKey, Service],
-      servicesPerActor: Map[ActorRef[_], Set[AbstractServiceKey]],
+      servicesPerActor: Map[ActorRef[?], Set[AbstractServiceKey]],
       subscriptions: TypedMultiMap[AbstractServiceKey, Subscriber],
-      subscriptionsPerActor: Map[ActorRef[_], Set[AbstractServiceKey]]) {
+      subscriptionsPerActor: Map[ActorRef[?], Set[AbstractServiceKey]]) {
 
     def serviceInstanceAdded[Key <: AbstractServiceKey](key: Key)(serviceInstance: ActorRef[key.Protocol]): State = {
       val newServices = services.inserted(key)(serviceInstance)
@@ -101,7 +101,7 @@ private[pekko] object LocalReceptionist extends ReceptionistBehaviorProvider {
       copy(services = newServices, servicesPerActor = newServicePerActor)
     }
 
-    def serviceInstanceRemoved(serviceInstance: ActorRef[_]): State = {
+    def serviceInstanceRemoved(serviceInstance: ActorRef[?]): State = {
       val keys = servicesPerActor.getOrElse(serviceInstance, Set.empty)
       val newServices =
         if (keys.isEmpty) services
@@ -140,7 +140,7 @@ private[pekko] object LocalReceptionist extends ReceptionistBehaviorProvider {
       copy(subscriptions = newSubscriptions, subscriptionsPerActor = newSubscriptionsPerActor)
     }
 
-    def subscriberRemoved(subscriber: ActorRef[_]): State = {
+    def subscriberRemoved(subscriber: ActorRef[?]): State = {
       val keys = subscriptionsPerActor.getOrElse(subscriber, Set.empty)
       if (keys.isEmpty) this
       else {
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/receptionist/ReceptionistImpl.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/receptionist/ReceptionistImpl.scala
index 9dfcff1577..762e660fee 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/receptionist/ReceptionistImpl.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/receptionist/ReceptionistImpl.scala
@@ -24,7 +24,7 @@ import pekko.annotation.InternalApi
 /**
  * INTERNAL API
  */
-@InternalApi private[pekko] class ReceptionistImpl(system: ActorSystem[_]) extends Receptionist {
+@InternalApi private[pekko] class ReceptionistImpl(system: ActorSystem[?]) extends Receptionist {
 
   override val ref: ActorRef[Receptionist.Command] = {
     val provider: ReceptionistBehaviorProvider =
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/receptionist/ReceptionistMessages.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/receptionist/ReceptionistMessages.scala
index bc7809a580..8e212d6ef8 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/receptionist/ReceptionistMessages.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/receptionist/ReceptionistMessages.scala
@@ -46,7 +46,7 @@ private[pekko] object ReceptionistMessages {
 
   final case class Registered[T] private[pekko] (key: ServiceKey[T], _serviceInstance: ActorRef[T])
       extends Receptionist.Registered {
-    def isForKey(key: ServiceKey[_]): Boolean = key == this.key
+    def isForKey(key: ServiceKey[?]): Boolean = key == this.key
     def serviceInstance[M](key: ServiceKey[M]): ActorRef[M] = {
       if (key != this.key)
         throw new IllegalArgumentException(s"Wrong key [$key] used, must use listing key [${this.key}]")
@@ -59,7 +59,7 @@ private[pekko] object ReceptionistMessages {
 
   final case class Deregistered[T] private[pekko] (key: ServiceKey[T], _serviceInstance: ActorRef[T])
       extends Receptionist.Deregistered {
-    def isForKey(key: ServiceKey[_]): Boolean = key == this.key
+    def isForKey(key: ServiceKey[?]): Boolean = key == this.key
     def serviceInstance[M](key: ServiceKey[M]): ActorRef[M] = {
       if (key != this.key)
         throw new IllegalArgumentException(s"Wrong key [$key] used, must use listing key [${this.key}]")
@@ -79,7 +79,7 @@ private[pekko] object ReceptionistMessages {
       servicesWereAddedOrRemoved: Boolean)
       extends Receptionist.Listing {
 
-    def isForKey(key: ServiceKey[_]): Boolean = key == this.key
+    def isForKey(key: ServiceKey[?]): Boolean = key == this.key
 
     def serviceInstances[M](key: ServiceKey[M]): Set[ActorRef[M]] = {
       if (key != this.key)
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/receptionist/ServiceKeySerializer.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/receptionist/ServiceKeySerializer.scala
index 282f2a5c26..9316e45b54 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/receptionist/ServiceKeySerializer.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/receptionist/ServiceKeySerializer.scala
@@ -28,13 +28,13 @@ final class ServiceKeySerializer(val system: pekko.actor.ExtendedActorSystem)
     extends SerializerWithStringManifest
     with BaseSerializer {
   def manifest(o: AnyRef): String = o match {
-    case key: DefaultServiceKey[_] => key.typeName
+    case key: DefaultServiceKey[?] => key.typeName
     case _                         =>
       throw new IllegalArgumentException(s"Can't serialize object of type ${o.getClass} in [${getClass.getName}]")
   }
 
   def toBinary(o: AnyRef): Array[Byte] = o match {
-    case serviceKey: DefaultServiceKey[_] => serviceKey.id.getBytes(StandardCharsets.UTF_8)
+    case serviceKey: DefaultServiceKey[?] => serviceKey.id.getBytes(StandardCharsets.UTF_8)
     case _                                =>
       throw new IllegalArgumentException(s"Cannot serialize object of type [${o.getClass.getName}]")
   }
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/routing/GroupRouterImpl.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/routing/GroupRouterImpl.scala
index a7c35b348b..4d006cf2e3 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/routing/GroupRouterImpl.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/routing/GroupRouterImpl.scala
@@ -33,7 +33,7 @@ import pekko.annotation.InternalApi
 private[pekko] final case class GroupRouterBuilder[T] private[pekko] (
     key: ServiceKey[T],
     preferLocalRoutees: Boolean = false,
-    logicFactory: ActorSystem[_] => RoutingLogic[T] = (_: ActorSystem[_]) => new RoutingLogics.RandomLogic[T]())
+    logicFactory: ActorSystem[?] => RoutingLogic[T] = (_: ActorSystem[?]) => new RoutingLogics.RandomLogic[T]())
     extends javadsl.GroupRouter[T]
     with scaladsl.GroupRouter[T] {
 
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/routing/PoolRouterImpl.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/routing/PoolRouterImpl.scala
index a8c016fde5..bd043aca0a 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/routing/PoolRouterImpl.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/internal/routing/PoolRouterImpl.scala
@@ -30,7 +30,7 @@ import pekko.util.ConstantFun
 private[pekko] final case class PoolRouterBuilder[T](
     poolSize: Int,
     behavior: Behavior[T],
-    logicFactory: ActorSystem[_] => RoutingLogic[T] = (_: ActorSystem[_]) => new RoutingLogics.RoundRobinLogic[T],
+    logicFactory: ActorSystem[?] => RoutingLogic[T] = (_: ActorSystem[?]) => new RoutingLogics.RoundRobinLogic[T],
     broadcastPredicate: T => Boolean = ConstantFun.anyToFalse,
     routeeProps: Props = Props.empty)
     extends javadsl.PoolRouter[T]
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/javadsl/ActorContext.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/javadsl/ActorContext.scala
index 2d15fb8fca..4c5d3519c3 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/javadsl/ActorContext.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/javadsl/ActorContext.scala
@@ -105,7 +105,7 @@ trait ActorContext[T] extends TypedActorContext[T] with ClassicActorContextProvi
    * *Warning*: This method is not thread-safe and must not be accessed from threads other
    * than the ordinary actor message processing thread, such as [[java.util.concurrent.CompletionStage]] callbacks.
    */
-  def setLoggerName(clazz: Class[_]): Unit
+  def setLoggerName(clazz: Class[?]): Unit
 
   /**
    * The list of child Actors created by this Actor during its lifetime that
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/javadsl/Adapter.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/javadsl/Adapter.scala
index bbd9edc07c..4aa942d4b7 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/javadsl/Adapter.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/javadsl/Adapter.scala
@@ -108,10 +108,10 @@ object Adapter {
   def toTyped(sys: pekko.actor.ActorSystem): ActorSystem[Void] =
     sys.toTyped.asInstanceOf[ActorSystem[Void]]
 
-  def toClassic(sys: ActorSystem[_]): pekko.actor.ActorSystem =
+  def toClassic(sys: ActorSystem[?]): pekko.actor.ActorSystem =
     sys.toClassic
 
-  def toClassic(ctx: ActorContext[_]): actor.ActorContext =
+  def toClassic(ctx: ActorContext[?]): actor.ActorContext =
     ActorContextAdapter.toClassic(ctx)
 
   def watch[U](ctx: pekko.actor.ActorContext, other: ActorRef[U]): Unit =
@@ -120,25 +120,25 @@ object Adapter {
   def unwatch[U](ctx: pekko.actor.ActorContext, other: ActorRef[U]): Unit =
     ctx.unwatch(other)
 
-  def stop(ctx: pekko.actor.ActorContext, child: ActorRef[_]): Unit =
+  def stop(ctx: pekko.actor.ActorContext, child: ActorRef[?]): Unit =
     ctx.stop(child)
 
-  def watch[U](ctx: ActorContext[_], other: pekko.actor.ActorRef): Unit =
+  def watch[U](ctx: ActorContext[?], other: pekko.actor.ActorRef): Unit =
     ctx.watch(other)
 
-  def unwatch[U](ctx: ActorContext[_], other: pekko.actor.ActorRef): Unit =
+  def unwatch[U](ctx: ActorContext[?], other: pekko.actor.ActorRef): Unit =
     ctx.unwatch(other)
 
-  def stop(ctx: ActorContext[_], child: pekko.actor.ActorRef): Unit =
+  def stop(ctx: ActorContext[?], child: pekko.actor.ActorRef): Unit =
     ctx.stop(child)
 
-  def actorOf(ctx: ActorContext[_], props: pekko.actor.Props): pekko.actor.ActorRef =
+  def actorOf(ctx: ActorContext[?], props: pekko.actor.Props): pekko.actor.ActorRef =
     ActorContextAdapter.toClassic(ctx).actorOf(props)
 
-  def actorOf(ctx: ActorContext[_], props: pekko.actor.Props, name: String): pekko.actor.ActorRef =
+  def actorOf(ctx: ActorContext[?], props: pekko.actor.Props, name: String): pekko.actor.ActorRef =
     ActorContextAdapter.toClassic(ctx).actorOf(props, name)
 
-  def toClassic(ref: ActorRef[_]): pekko.actor.ActorRef =
+  def toClassic(ref: ActorRef[?]): pekko.actor.ActorRef =
     ref.toClassic
 
   def toTyped[T](ref: pekko.actor.ActorRef): ActorRef[T] =
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/javadsl/BehaviorBuilder.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/javadsl/BehaviorBuilder.scala
index 96b4047742..a8e4a5dd56 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/javadsl/BehaviorBuilder.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/javadsl/BehaviorBuilder.scala
@@ -81,7 +81,7 @@ final class BehaviorBuilder[T] private (messageHandlers: List[Case[T, T]], signa
    * @param handler action to apply when the type matches
    * @return a new behavior builder with the specified handling appended
    */
-  def onMessageUnchecked[M <: T](`type`: Class[_ <: T], handler: JFunction[M, Behavior[T]]): BehaviorBuilder[T] =
+  def onMessageUnchecked[M <: T](`type`: Class[? <: T], handler: JFunction[M, Behavior[T]]): BehaviorBuilder[T] =
     withMessage[M](OptionVal.Some(`type`.asInstanceOf[Class[M]]), OptionVal.None, handler)
 
   /**
@@ -173,7 +173,7 @@ object BehaviorBuilder {
   /** INTERNAL API */
   @InternalApi
   private[javadsl] final case class Case[BT, MT](
-      `type`: OptionVal[Class[_ <: MT]],
+      `type`: OptionVal[Class[? <: MT]],
       test: OptionVal[MT => Boolean],
       handler: JFunction[MT, Behavior[BT]])
 
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/javadsl/ReceiveBuilder.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/javadsl/ReceiveBuilder.scala
index 1b72e8cab4..fa706b65fb 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/javadsl/ReceiveBuilder.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/javadsl/ReceiveBuilder.scala
@@ -76,7 +76,7 @@ final class ReceiveBuilder[T] private (
    * @param handler action to apply when the type matches
    * @return this behavior builder
    */
-  def onMessageUnchecked[M <: T](`type`: Class[_ <: T], handler: JFunction[M, Behavior[T]]): ReceiveBuilder[T] =
+  def onMessageUnchecked[M <: T](`type`: Class[? <: T], handler: JFunction[M, Behavior[T]]): ReceiveBuilder[T] =
     withMessage[M](OptionVal.Some(`type`.asInstanceOf[Class[M]]), OptionVal.None, handler)
 
   /**
@@ -173,7 +173,7 @@ object ReceiveBuilder {
   /** INTERNAL API */
   @InternalApi
   private[javadsl] final case class Case[BT, MT](
-      `type`: OptionVal[Class[_ <: MT]],
+      `type`: OptionVal[Class[? <: MT]],
       test: OptionVal[JPredicate[MT]],
       handler: JFunction[MT, Behavior[BT]])
 
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/receptionist/Receptionist.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/receptionist/Receptionist.scala
index b6fdb63441..89fa1469d2 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/receptionist/Receptionist.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/receptionist/Receptionist.scala
@@ -104,8 +104,8 @@ abstract class ServiceKey[T] extends AbstractServiceKey { key =>
  * The receptionist is easiest accessed through the system: [[ActorSystem.receptionist]]
  */
 object Receptionist extends ExtensionId[Receptionist] {
-  def createExtension(system: ActorSystem[_]): Receptionist = new ReceptionistImpl(system)
-  def get(system: ActorSystem[_]): Receptionist = apply(system)
+  def createExtension(system: ActorSystem[?]): Receptionist = new ReceptionistImpl(system)
+  def get(system: ActorSystem[?]): Receptionist = apply(system)
 
   /**
    * The set of commands accepted by a Receptionist.
@@ -172,13 +172,13 @@ object Receptionist extends ExtensionId[Receptionist] {
   @DoNotInherit
   trait Registered {
 
-    def isForKey(key: ServiceKey[_]): Boolean
+    def isForKey(key: ServiceKey[?]): Boolean
 
     /** Scala API */
-    def key: ServiceKey[_]
+    def key: ServiceKey[?]
 
     /** Java API */
-    def getKey: ServiceKey[_] = key
+    def getKey: ServiceKey[?] = key
 
     /**
      * Scala API
@@ -255,13 +255,13 @@ object Receptionist extends ExtensionId[Receptionist] {
   @DoNotInherit
   trait Deregistered {
 
-    def isForKey(key: ServiceKey[_]): Boolean
+    def isForKey(key: ServiceKey[?]): Boolean
 
     /** Scala API */
-    def key: ServiceKey[_]
+    def key: ServiceKey[?]
 
     /** Java API */
-    def getKey: ServiceKey[_] = key
+    def getKey: ServiceKey[?] = key
 
     /**
      * Scala API
@@ -354,12 +354,12 @@ object Receptionist extends ExtensionId[Receptionist] {
   trait Listing {
 
     /** Scala API */
-    def key: ServiceKey[_]
+    def key: ServiceKey[?]
 
     /** Java API */
-    def getKey: ServiceKey[_] = key
+    def getKey: ServiceKey[?] = key
 
-    def isForKey(key: ServiceKey[_]): Boolean
+    def isForKey(key: ServiceKey[?]): Boolean
 
     /**
      * Scala API: Return the reachable service instances.
@@ -463,7 +463,7 @@ object Receptionist extends ExtensionId[Receptionist] {
 }
 
 object ReceptionistSetup {
-  def apply[T <: Extension](createExtension: ActorSystem[_] => Receptionist): ReceptionistSetup =
+  def apply[T <: Extension](createExtension: ActorSystem[?] => Receptionist): ReceptionistSetup =
     new ReceptionistSetup(createExtension(_))
 
 }
@@ -473,5 +473,5 @@ object ReceptionistSetup {
  * to replace the default implementation of the [[Receptionist]] extension. Intended
  * for tests that need to replace extension with stub/mock implementations.
  */
-final class ReceptionistSetup(createExtension: java.util.function.Function[ActorSystem[_], Receptionist])
+final class ReceptionistSetup(createExtension: java.util.function.Function[ActorSystem[?], Receptionist])
     extends ExtensionSetup[Receptionist](Receptionist, createExtension)
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/scaladsl/ActorContext.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/scaladsl/ActorContext.scala
index 86ab53c765..e7565d03e7 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/scaladsl/ActorContext.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/scaladsl/ActorContext.scala
@@ -105,7 +105,7 @@ trait ActorContext[T] extends TypedActorContext[T] with ClassicActorContextProvi
    * *Warning*: This method is not thread-safe and must not be accessed from threads other
    * than the ordinary actor message processing thread, such as [[scala.concurrent.Future]] callbacks.
    */
-  def setLoggerName(clazz: Class[_]): Unit
+  def setLoggerName(clazz: Class[?]): Unit
 
   /**
    * The list of child Actors created by this Actor during its lifetime that
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/scaladsl/AskPattern.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/scaladsl/AskPattern.scala
index a3e813a0ff..5ab409bccb 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/scaladsl/AskPattern.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/scaladsl/AskPattern.scala
@@ -41,7 +41,7 @@ object AskPattern {
    * Provides a scheduler from an actor system (that will likely already be implicit in the scope) to minimize ask
    * boilerplate.
    */
-  implicit def schedulerFromActorSystem(implicit system: ActorSystem[_]): Scheduler = system.scheduler
+  implicit def schedulerFromActorSystem(implicit system: ActorSystem[?]): Scheduler = system.scheduler
 
   /**
    * See [[ask]]
@@ -141,7 +141,7 @@ object AskPattern {
 
   private val onTimeout: String => Throwable = msg => new TimeoutException(msg)
 
-  private final class PromiseRef[U](target: InternalRecipientRef[_], timeout: Timeout) {
+  private final class PromiseRef[U](target: InternalRecipientRef[?], timeout: Timeout) {
 
     // Note: _promiseRef mustn't have a type pattern, since it can be null
     private[this] val (_ref: ActorRef[U], _future: Future[U], _promiseRef) =
diff --git a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/scaladsl/adapter/package.scala b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/scaladsl/adapter/package.scala
index 18e6583eea..99b1039c54 100644
--- a/actor-typed/src/main/scala/org/apache/pekko/actor/typed/scaladsl/adapter/package.scala
+++ b/actor-typed/src/main/scala/org/apache/pekko/actor/typed/scaladsl/adapter/package.scala
@@ -83,7 +83,7 @@ package object adapter {
   /**
    * Extension methods added to [[pekko.actor.typed.ActorSystem]].
    */
-  implicit class TypedActorSystemOps(val sys: ActorSystem[_]) extends AnyVal {
+  implicit class TypedActorSystemOps(val sys: ActorSystem[?]) extends AnyVal {
     def toClassic: pekko.actor.ActorSystem = sys.classicSystem
 
     /**
@@ -132,14 +132,14 @@ package object adapter {
     def watch[U](other: ActorRef[U]): Unit = ctx.watch(ActorRefAdapter.toClassic(other))
     def unwatch[U](other: ActorRef[U]): Unit = ctx.unwatch(ActorRefAdapter.toClassic(other))
 
-    def stop(child: ActorRef[_]): Unit =
+    def stop(child: ActorRef[?]): Unit =
       ctx.stop(ActorRefAdapter.toClassic(child))
   }
 
   /**
    * Extension methods added to [[pekko.actor.typed.scaladsl.ActorContext]].
    */
-  implicit class TypedActorContextOps(val ctx: scaladsl.ActorContext[_]) extends AnyVal {
+  implicit class TypedActorContextOps(val ctx: scaladsl.ActorContext[?]) extends AnyVal {
     def actorOf(props: pekko.actor.Props): pekko.actor.ActorRef =
       ActorContextAdapter.toClassic(ctx).actorOf(props)
 
@@ -154,7 +154,7 @@ package object adapter {
   /**
    * Extension methods added to [[pekko.actor.typed.ActorRef]].
    */
-  implicit class TypedActorRefOps(val ref: ActorRef[_]) extends AnyVal {
+  implicit class TypedActorRefOps(val ref: ActorRef[?]) extends AnyVal {
     def toClassic: pekko.actor.ActorRef = ActorRefAdapter.toClassic(ref)
   }
 
diff --git a/actor/src/main/scala-3/org/apache/pekko/util/ByteIterator.scala b/actor/src/main/scala-3/org/apache/pekko/util/ByteIterator.scala
index 794194f995..dd727215ee 100644
--- a/actor/src/main/scala-3/org/apache/pekko/util/ByteIterator.scala
+++ b/actor/src/main/scala-3/org/apache/pekko/util/ByteIterator.scala
@@ -46,7 +46,7 @@ object ByteIterator {
     final def head: Byte = array(from)
 
     final def next(): Byte = {
-      if (!hasNext) EmptyImmutableSeq.iterator.next()
+      if !hasNext then EmptyImmutableSeq.iterator.next()
       else {
         val i = from; from = from + 1; array(i)
       }
@@ -58,12 +58,12 @@ object ByteIterator {
 
     final override def ++(that: IterableOnce[Byte]): ByteIterator = that match {
       case that: ByteIterator =>
-        if (that.isEmpty) this
-        else if (this.isEmpty) that
+        if that.isEmpty then this
+        else if this.isEmpty then that
         else
           that match {
             case that: ByteArrayIterator =>
-              if ((this.array eq that.array) && (this.until == that.from)) {
+              if (this.array eq that.array) && (this.until == that.from) then {
                 this.until = that.until
                 that.clear()
                 this
@@ -80,12 +80,12 @@ object ByteIterator {
     final override def clone: ByteArrayIterator = new ByteArrayIterator(array, from, until)
 
     final override def take(n: Int): this.type = {
-      if (n < len) until = { if (n > 0) from + n else from }
+      if n < len then until = { if n > 0 then from + n else from }
       this
     }
 
     final override def drop(n: Int): this.type = {
-      if (n > 0) from = { if (n < len) from + n else until }
+      if n > 0 then from = { if n < len then from + n else until }
       this
     }
 
@@ -98,8 +98,8 @@ object ByteIterator {
 
     final override def dropWhile(p: Byte => Boolean): this.type = {
       var stop = false
-      while (!stop && hasNext) {
-        if (p(array(from))) {
+      while !stop && hasNext do {
+        if p(array(from)) then {
           from = from + 1
         } else {
           stop = true
@@ -123,7 +123,7 @@ object ByteIterator {
 
     final override def toByteString: ByteString = {
       val result =
-        if ((from == 0) && (until == array.length)) ByteString.ByteString1C(array)
+        if (from == 0) && (until == array.length) then ByteString.ByteString1C(array)
         else ByteString.ByteString1(array, from, len)
       clear()
       result
@@ -131,28 +131,28 @@ object ByteIterator {
 
     @throws[NoSuchElementException]
     def getBytes(xs: Array[Byte], offset: Int, n: Int): this.type = {
-      if (n <= this.len) {
+      if n <= this.len then {
         System.arraycopy(this.array, this.from, xs, offset, n)
         this.drop(n)
       } else throw new NoSuchElementException("next on empty iterator")
     }
 
     override def getShort(implicit byteOrder: ByteOrder): Short = {
-      if (len < 2) throw new NoSuchElementException("next on empty iterator")
+      if len < 2 then throw new NoSuchElementException("next on empty iterator")
       val result = SWARUtil.getShort(array, from, byteOrder)
       from += 2
       result
     }
 
     override def getInt(implicit byteOrder: ByteOrder): Int = {
-      if (len < 4) throw new NoSuchElementException("next on empty iterator")
+      if len < 4 then throw new NoSuchElementException("next on empty iterator")
       val result = SWARUtil.getInt(array, from, byteOrder)
       from += 4
       result
     }
 
     override def getLong(implicit byteOrder: ByteOrder): Long = {
-      if (len < 8) throw new NoSuchElementException("next on empty iterator")
+      if len < 8 then throw new NoSuchElementException("next on empty iterator")
       val result = SWARUtil.getLong(array, from, byteOrder)
       from += 8
       result
@@ -182,7 +182,7 @@ object ByteIterator {
 
     def copyToBuffer(buffer: ByteBuffer): Int = {
       val copyLength = math.min(buffer.remaining, len)
-      if (copyLength > 0) {
+      if copyLength > 0 then {
         buffer.put(array, from, copyLength)
         drop(copyLength)
       }
@@ -192,12 +192,12 @@ object ByteIterator {
     def asInputStream: java.io.InputStream = new java.io.InputStream {
       override def available: Int = iterator.len
 
-      def read: Int = if (hasNext) next().toInt & 0xFF else -1
+      def read: Int = if hasNext then next().toInt & 0xFF else -1
 
       override def read(b: Array[Byte], off: Int, len: Int): Int = {
-        if ((off < 0) || (len < 0) || (off + len > b.length)) throw new IndexOutOfBoundsException
-        if (len == 0) 0
-        else if (!isEmpty) {
+        if (off < 0) || (len < 0) || (off + len > b.length) then throw new IndexOutOfBoundsException
+        if len == 0 then 0
+        else if !isEmpty then {
           val nRead = math.min(available(), len)
           copyToArray(b, off, nRead)
           nRead
@@ -227,8 +227,8 @@ object ByteIterator {
     // * (!iterator.head.isEmpty || iterators.tail.isEmpty) == true
     private def normalize(): this.type = {
       @tailrec def norm(xs: LinearSeq[ByteArrayIterator]): LinearSeq[ByteArrayIterator] = {
-        if (xs.isEmpty) MultiByteArrayIterator.clearedList
-        else if (xs.head.isEmpty) norm(xs.tail)
+        if xs.isEmpty then MultiByteArrayIterator.clearedList
+        else if xs.head.isEmpty then norm(xs.tail)
         else xs
       }
       iterators = norm(iterators)
@@ -255,7 +255,7 @@ object ByteIterator {
     // back to the byte-by-byte super impl. Cross-fragment reads keep the byte-by-byte path.
     override def getShort(implicit byteOrder: ByteOrder): Short = {
       val cur = current
-      if (cur.len >= java.lang.Short.BYTES) {
+      if cur.len >= java.lang.Short.BYTES then {
         val r = cur.getShort(byteOrder)
         normalize()
         r
@@ -264,7 +264,7 @@ object ByteIterator {
 
     override def getInt(implicit byteOrder: ByteOrder): Int = {
       val cur = current
-      if (cur.len >= java.lang.Integer.BYTES) {
+      if cur.len >= java.lang.Integer.BYTES then {
         val r = cur.getInt(byteOrder)
         normalize()
         r
@@ -273,7 +273,7 @@ object ByteIterator {
 
     override def getLong(implicit byteOrder: ByteOrder): Long = {
       val cur = current
-      if (cur.len >= java.lang.Long.BYTES) {
+      if cur.len >= java.lang.Long.BYTES then {
         val r = cur.getLong(byteOrder)
         normalize()
         r
@@ -295,8 +295,8 @@ object ByteIterator {
 
     final override def ++(that: IterableOnce[Byte]): ByteIterator = that match {
       case that: ByteIterator =>
-        if (that.isEmpty) this
-        else if (this.isEmpty) that
+        if that.isEmpty then this
+        else if this.isEmpty then that
         else {
           that match {
             case that: ByteArrayIterator =>
@@ -321,9 +321,9 @@ object ByteIterator {
     final override def take(n: Int): this.type = {
       var rest = n
       val builder = new ListBuffer[ByteArrayIterator]
-      while ((rest > 0) && !iterators.isEmpty) {
+      while (rest > 0) && !iterators.isEmpty do {
         current.take(rest)
-        if (current.hasNext) {
+        if current.hasNext then {
           rest -= current.len
           builder += current
         }
@@ -335,7 +335,7 @@ object ByteIterator {
 
     /** For performance sensitive code, call drop() directly on ByteString (it's optimised there) */
     final override def drop(n: Int): this.type =
-      if ((n > 0) && !isEmpty) {
+      if (n > 0) && !isEmpty then {
         val nCurrent = math.min(n, current.len)
         current.drop(n)
         val rest = n - nCurrent
@@ -347,11 +347,11 @@ object ByteIterator {
     final override def takeWhile(p: Byte => Boolean): this.type = {
       var stop = false
       val builder = new ListBuffer[ByteArrayIterator]
-      while (!stop && !iterators.isEmpty) {
+      while !stop && !iterators.isEmpty do {
         val lastLen = current.len
         current.takeWhile(p)
-        if (current.hasNext) builder += current
-        if (current.len < lastLen) stop = true
+        if current.hasNext then builder += current
+        if current.len < lastLen then stop = true
         dropCurrent()
       }
       iterators = builder.result()
@@ -359,22 +359,22 @@ object ByteIterator {
     }
 
     @tailrec final override def dropWhile(p: Byte => Boolean): this.type =
-      if (!isEmpty) {
+      if !isEmpty then {
         current.dropWhile(p)
         val dropMore = current.isEmpty
         normalize()
-        if (dropMore) dropWhile(p) else this
+        if dropMore then dropWhile(p) else this
       } else this
 
     final override def copyToArray[B >: Byte](xs: Array[B], start: Int, len: Int): Int = {
       var pos = start
       var rest = len
-      while ((rest > 0) && !iterators.isEmpty && pos < xs.length) {
+      while (rest > 0) && !iterators.isEmpty && pos < xs.length do {
         val n = 0 max ((xs.length - pos) min current.len min rest)
         current.copyToArray(xs, pos, n)
         pos += n
         rest -= n
-        if (current.isEmpty) {
+        if current.isEmpty then {
           dropCurrent()
         }
       }
@@ -388,7 +388,7 @@ object ByteIterator {
     }
 
     final override def toByteString: ByteString = {
-      if (iterators.tail.isEmpty) iterators.head.toByteString
+      if iterators.tail.isEmpty then iterators.head.toByteString
       else {
         val result = iterators.foldLeft(ByteString.empty) { _ ++ _.toByteString }
         clear()
@@ -398,10 +398,10 @@ object ByteIterator {
 
     @tailrec protected final def getToArray[A](xs: Array[A], offset: Int, n: Int, elemSize: Int)(getSingle: => A)(
         getMult: (Array[A], Int, Int) => Unit): this.type =
-      if (n <= 0) this
+      if n <= 0 then this
       else {
-        if (isEmpty) EmptyImmutableSeq.iterator.next()
-        val nDone = if (current.len >= elemSize) {
+        if isEmpty then EmptyImmutableSeq.iterator.next()
+        val nDone = if current.len >= elemSize then {
           val nCurrent = math.min(n, current.len / elemSize)
           getMult(xs, offset, nCurrent)
           nCurrent
@@ -442,7 +442,7 @@ object ByteIterator {
     def asInputStream: java.io.InputStream = new java.io.InputStream {
       override def available: Int = current.len
 
-      def read: Int = if (hasNext) next().toInt & 0xFF else -1
+      def read: Int = if hasNext then next().toInt & 0xFF else -1
 
       override def read(b: Array[Byte], off: Int, len: Int): Int = {
         val nRead = current.asInputStream.read(b, off, len)
@@ -452,13 +452,13 @@ object ByteIterator {
 
       override def skip(n: Long): Long = {
         @tailrec def skipImpl(n: Long, skipped: Long): Long =
-          if (n > 0) {
-            if (!isEmpty) {
+          if n > 0 then {
+            if !isEmpty then {
               val m = current.asInputStream.skip(n)
               normalize()
               val newN = n - m
               val newSkipped = skipped + m
-              if (newN > 0) skipImpl(newN, newSkipped)
+              if newN > 0 then skipImpl(newN, newSkipped)
               else newSkipped
             } else 0
           } else 0
@@ -483,7 +483,7 @@ abstract class ByteIterator extends BufferedIterator[Byte] {
 
   def ++(that: IterableOnce[Byte]): ByteIterator = {
     val it = that.iterator
-    if (it.isEmpty) this
+    if it.isEmpty then this
     else ByteIterator.ByteArrayIterator(it.toArray)
   }
 
@@ -508,7 +508,7 @@ abstract class ByteIterator extends BufferedIterator[Byte] {
     throw new UnsupportedOperationException("Method drop is not implemented in ByteIterator")
 
   override def slice(from: Int, until: Int): this.type = {
-    if (from > 0) drop(from).take(until - from)
+    if from > 0 then drop(from).take(until - from)
     else take(until)
   }
 
@@ -533,17 +533,18 @@ abstract class ByteIterator extends BufferedIterator[Byte] {
 
   override def indexWhere(p: Byte => Boolean, from: Int = 0): Int = {
     var index = 0
-    while (index < from && hasNext) {
+    while index < from && hasNext do {
       next()
       index += 1
     }
     var found = false
-    while (!found && hasNext) if (p(next())) {
-      found = true
-    } else {
-      index += 1
-    }
-    if (found) index else -1
+    while !found && hasNext do
+      if p(next()) then {
+        found = true
+      } else {
+        index += 1
+      }
+    if found then index else -1
   }
 
   def indexOf(elem: Byte): Int = indexOf(elem, 0)
@@ -557,7 +558,7 @@ abstract class ByteIterator extends BufferedIterator[Byte] {
   override def toSeq: ByteString = toByteString
 
   override def foreach[@specialized U](f: Byte => U): Unit =
-    while (hasNext) f(next())
+    while hasNext do f(next())
 
   override def foldLeft[@specialized B](z: B)(op: (B, Byte) => B): B = {
     var acc = z
@@ -582,9 +583,9 @@ abstract class ByteIterator extends BufferedIterator[Byte] {
    * Get a single Short from this iterator.
    */
   def getShort(implicit byteOrder: ByteOrder): Short = {
-    if (byteOrder == ByteOrder.BIG_ENDIAN)
+    if byteOrder == ByteOrder.BIG_ENDIAN then
       ((next() & 0xFF) << 8 | (next() & 0xFF) << 0).toShort
-    else if (byteOrder == ByteOrder.LITTLE_ENDIAN)
+    else if byteOrder == ByteOrder.LITTLE_ENDIAN then
       ((next() & 0xFF) << 0 | (next() & 0xFF) << 8).toShort
     else throw new IllegalArgumentException("Unknown byte order " + byteOrder)
   }
@@ -593,12 +594,12 @@ abstract class ByteIterator extends BufferedIterator[Byte] {
    * Get a single Int from this iterator.
    */
   def getInt(implicit byteOrder: ByteOrder): Int = {
-    if (byteOrder == ByteOrder.BIG_ENDIAN)
+    if byteOrder == ByteOrder.BIG_ENDIAN then
       ((next() & 0xFF) << 24
       | (next() & 0xFF) << 16
       | (next() & 0xFF) << 8
       | (next() & 0xFF) << 0)
-    else if (byteOrder == ByteOrder.LITTLE_ENDIAN)
+    else if byteOrder == ByteOrder.LITTLE_ENDIAN then
       ((next() & 0xFF) << 0
       | (next() & 0xFF) << 8
       | (next() & 0xFF) << 16
@@ -610,7 +611,7 @@ abstract class ByteIterator extends BufferedIterator[Byte] {
    * Get a single Long from this iterator.
    */
   def getLong(implicit byteOrder: ByteOrder): Long = {
-    if (byteOrder == ByteOrder.BIG_ENDIAN)
+    if byteOrder == ByteOrder.BIG_ENDIAN then
       ((next().toLong & 0xFF) << 56
       | (next().toLong & 0xFF) << 48
       | (next().toLong & 0xFF) << 40
@@ -619,7 +620,7 @@ abstract class ByteIterator extends BufferedIterator[Byte] {
       | (next().toLong & 0xFF) << 16
       | (next().toLong & 0xFF) << 8
       | (next().toLong & 0xFF) << 0)
-    else if (byteOrder == ByteOrder.LITTLE_ENDIAN)
+    else if byteOrder == ByteOrder.LITTLE_ENDIAN then
       ((next().toLong & 0xFF) << 0
       | (next().toLong & 0xFF) << 8
       | (next().toLong & 0xFF) << 16
@@ -636,11 +637,11 @@ abstract class ByteIterator extends BufferedIterator[Byte] {
    * bytes were encoded.
    */
   def getLongPart(n: Int)(implicit byteOrder: ByteOrder): Long = {
-    if (byteOrder == ByteOrder.BIG_ENDIAN) {
+    if byteOrder == ByteOrder.BIG_ENDIAN then {
       var x = 0L
       (1 to n).foreach(_ => x = (x << 8) | (next() & 0xFF))
       x
-    } else if (byteOrder == ByteOrder.LITTLE_ENDIAN) {
+    } else if byteOrder == ByteOrder.LITTLE_ENDIAN then {
       var x = 0L
       (0 until n).foreach(i => x |= (next() & 0xFF) << 8 * i)
       x
diff --git a/actor/src/main/scala/org/apache/pekko/actor/AbstractProps.scala b/actor/src/main/scala/org/apache/pekko/actor/AbstractProps.scala
index 78912498f4..bff3f4f22f 100644
--- a/actor/src/main/scala/org/apache/pekko/actor/AbstractProps.scala
+++ b/actor/src/main/scala/org/apache/pekko/actor/AbstractProps.scala
@@ -30,7 +30,7 @@ private[pekko] trait AbstractProps {
   /**
    * INTERNAL API
    */
-  private[pekko] def validate(clazz: Class[_]): Unit = {
+  private[pekko] def validate(clazz: Class[?]): Unit = {
     if (Modifier.isAbstract(clazz.getModifiers)) {
       throw new IllegalArgumentException(s"Actor class [${clazz.getName}] must not be abstract")
     } else if (!classOf[Actor].isAssignableFrom(clazz) &&
@@ -44,7 +44,7 @@ private[pekko] trait AbstractProps {
    * Java API: create a Props given a class and its constructor arguments.
    */
   @varargs
-  def create(clazz: Class[_], args: AnyRef*): Props =
+  def create(clazz: Class[?], args: AnyRef*): Props =
     new Props(deploy = Props.defaultDeploy, clazz = clazz, args = args.toList)
 
   /**
@@ -55,10 +55,10 @@ private[pekko] trait AbstractProps {
     create(classOf[CreatorConsumer], actorClass, creator)
   }
 
-  private def checkCreatorClosingOver(clazz: Class[_]): Unit = {
+  private def checkCreatorClosingOver(clazz: Class[?]): Unit = {
     val enclosingClass = clazz.getEnclosingClass
 
-    def hasDeclaredConstructorWithEmptyParams(declaredConstructors: Array[Constructor[_]]): Boolean = {
+    def hasDeclaredConstructorWithEmptyParams(declaredConstructors: Array[Constructor[?]]): Boolean = {
       @tailrec def loop(i: Int): Boolean = {
         if (i == declaredConstructors.length) false
         else {
@@ -71,7 +71,7 @@ private[pekko] trait AbstractProps {
       loop(0)
     }
 
-    def hasDeclaredConstructorWithEnclosingClassParam(declaredConstructors: Array[Constructor[_]]): Boolean = {
+    def hasDeclaredConstructorWithEnclosingClassParam(declaredConstructors: Array[Constructor[?]]): Boolean = {
       @tailrec def loop(i: Int): Boolean = {
         if (i == declaredConstructors.length) false
         else {
diff --git a/actor/src/main/scala/org/apache/pekko/actor/ActorCell.scala b/actor/src/main/scala/org/apache/pekko/actor/ActorCell.scala
index eafd287823..7f853edd8e 100644
--- a/actor/src/main/scala/org/apache/pekko/actor/ActorCell.scala
+++ b/actor/src/main/scala/org/apache/pekko/actor/ActorCell.scala
@@ -729,5 +729,5 @@ private[pekko] class ActorCell(
     try system.eventStream.publish(e)
     catch { case NonFatal(_) => }
 
-  protected final def clazz(o: AnyRef): Class[_] = if (o eq null) this.getClass else o.getClass
+  protected final def clazz(o: AnyRef): Class[?] = if (o eq null) this.getClass else o.getClass
 }
diff --git a/actor/src/main/scala/org/apache/pekko/actor/ActorSystem.scala b/actor/src/main/scala/org/apache/pekko/actor/ActorSystem.scala
index ba3ace091b..cc0ae959a9 100644
--- a/actor/src/main/scala/org/apache/pekko/actor/ActorSystem.scala
+++ b/actor/src/main/scala/org/apache/pekko/actor/ActorSystem.scala
@@ -739,7 +739,7 @@ abstract class ActorSystem extends ActorRefFactory with ClassicActorSystemProvid
    * Returns whether the specified extension is already registered, this method can potentially block, waiting for the initialization
    * of the payload, if is in the process of registration from another Thread of execution
    */
-  def hasExtension(ext: ExtensionId[_ <: Extension]): Boolean
+  def hasExtension(ext: ExtensionId[? <: Extension]): Boolean
 }
 
 /**
@@ -1189,7 +1189,7 @@ private[pekko] class ActorSystemImpl(
   // 1) a CountDownLatch (if it's still in the process of being registered),
   // 2) a Throwable (if it failed initializing), or
   // 3) the registered extension.
-  private val extensions = new ConcurrentHashMap[ExtensionId[_], AnyRef]
+  private val extensions = new ConcurrentHashMap[ExtensionId[?], AnyRef]
 
   /**
    * Returns any extension registered to the specified Extension or returns null if not registered
@@ -1246,7 +1246,7 @@ private[pekko] class ActorSystemImpl(
     case some => some.asInstanceOf[T]
   }
 
-  def hasExtension(ext: ExtensionId[_ <: Extension]): Boolean = findExtension(ext) != null
+  def hasExtension(ext: ExtensionId[? <: Extension]): Boolean = findExtension(ext) != null
 
   private def loadExtensions(): Unit = {
 
@@ -1264,7 +1264,7 @@ private[pekko] class ActorSystemImpl(
         } match {
           case Success(p: ExtensionIdProvider) =>
             registerExtension(p.lookup)
-          case Success(p: ExtensionId[_]) =>
+          case Success(p: ExtensionId[?]) =>
             registerExtension(p)
           case Success(_) =>
             if (!throwOnLoadFail) log.error("[{}] is not an 'ExtensionIdProvider' or 'ExtensionId', skipping...", fqcn)
diff --git a/actor/src/main/scala/org/apache/pekko/actor/CoordinatedShutdown.scala b/actor/src/main/scala/org/apache/pekko/actor/CoordinatedShutdown.scala
index 052ef802d7..e11b514d35 100644
--- a/actor/src/main/scala/org/apache/pekko/actor/CoordinatedShutdown.scala
+++ b/actor/src/main/scala/org/apache/pekko/actor/CoordinatedShutdown.scala
@@ -318,7 +318,7 @@ object CoordinatedShutdown extends ExtensionId[CoordinatedShutdown] with Extensi
       depends-on = []
     """)
     phasesConf.root.unwrapped.asScala.toMap.map {
-      case (k, _: java.util.Map[_, _]) =>
+      case (k, _: java.util.Map[?, ?]) =>
         val c = phasesConf.getConfig(k).withFallback(defaultPhaseConfig)
         val dependsOn = c.getStringList("depends-on").asScala.toSet
         val timeout = c.getDuration("timeout", MILLISECONDS).millis
diff --git a/actor/src/main/scala/org/apache/pekko/actor/Deployer.scala b/actor/src/main/scala/org/apache/pekko/actor/Deployer.scala
index ebbc9d79b3..9a9394bb58 100644
--- a/actor/src/main/scala/org/apache/pekko/actor/Deployer.scala
+++ b/actor/src/main/scala/org/apache/pekko/actor/Deployer.scala
@@ -293,7 +293,7 @@ private[pekko] class Deployer(val settings: ActorSystem.Settings, val dynamicAcc
 
       val fqn = routerTypeMapping.getOrElse(routerType, routerType)
 
-      def throwCannotInstantiateRouter(args: Seq[(Class[_], AnyRef)], cause: Throwable) =
+      def throwCannotInstantiateRouter(args: Seq[(Class[?], AnyRef)], cause: Throwable) =
         throw new IllegalArgumentException(
           s"Cannot instantiate router [$fqn], defined in [$key], " +
           s"make sure it extends [${classOf[RouterConfig]}] and has constructor with " +
diff --git a/actor/src/main/scala/org/apache/pekko/actor/DynamicAccess.scala b/actor/src/main/scala/org/apache/pekko/actor/DynamicAccess.scala
index 0797c4444b..dd89062f80 100644
--- a/actor/src/main/scala/org/apache/pekko/actor/DynamicAccess.scala
+++ b/actor/src/main/scala/org/apache/pekko/actor/DynamicAccess.scala
@@ -40,13 +40,13 @@ import pekko.annotation.DoNotInherit
    * val obj = DynamicAccess.createInstanceFor(clazz, Seq(classOf[Config] -> config, classOf[String] -> name))
    * }}}
    */
-  def createInstanceFor[T: ClassTag](clazz: Class[_], args: immutable.Seq[(Class[_], AnyRef)]): Try[T]
+  def createInstanceFor[T: ClassTag](clazz: Class[?], args: immutable.Seq[(Class[?], AnyRef)]): Try[T]
 
   /**
    * Obtain a `Class[_]` object loaded with the right class loader (i.e. the one
    * returned by `classLoader`).
    */
-  def getClassFor[T: ClassTag](fqcn: String): Try[Class[_ <: T]]
+  def getClassFor[T: ClassTag](fqcn: String): Try[Class[? <: T]]
 
   def classIsOnClasspath(fqcn: String): Boolean
 
@@ -57,7 +57,7 @@ import pekko.annotation.DoNotInherit
    * `args` argument. The exact usage of args depends on which type is requested,
    * see the relevant requesting code for details.
    */
-  def createInstanceFor[T: ClassTag](fqcn: String, args: immutable.Seq[(Class[_], AnyRef)]): Try[T]
+  def createInstanceFor[T: ClassTag](fqcn: String, args: immutable.Seq[(Class[?], AnyRef)]): Try[T]
 
   /**
    * Obtain the Scala “object” instance for the given fully-qualified class name, if there is one.
diff --git a/actor/src/main/scala/org/apache/pekko/actor/Extension.scala b/actor/src/main/scala/org/apache/pekko/actor/Extension.scala
index 00dc881af3..4c34ede55c 100644
--- a/actor/src/main/scala/org/apache/pekko/actor/Extension.scala
+++ b/actor/src/main/scala/org/apache/pekko/actor/Extension.scala
@@ -139,5 +139,5 @@ trait ExtensionIdProvider {
   /**
    * Returns the canonical ExtensionId for this Extension
    */
-  def lookup: ExtensionId[_ <: Extension]
+  def lookup: ExtensionId[? <: Extension]
 }
diff --git a/actor/src/main/scala/org/apache/pekko/actor/FSM.scala b/actor/src/main/scala/org/apache/pekko/actor/FSM.scala
index a46a7378fa..49aef7c78b 100644
--- a/actor/src/main/scala/org/apache/pekko/actor/FSM.scala
+++ b/actor/src/main/scala/org/apache/pekko/actor/FSM.scala
@@ -228,13 +228,13 @@ object FSM {
 
     def canEqual(that: Any): Boolean = {
       that match {
-        case _: State[_, _] => true
+        case _: State[?, ?] => true
         case _              => false
       }
     }
 
     override def equals(that: Any) = that match {
-      case other: State[_, _] =>
+      case other: State[?, ?] =>
         other.canEqual(this) &&
         this.stateName == other.stateName &&
         this.stateData == other.stateData &&
diff --git a/actor/src/main/scala/org/apache/pekko/actor/FaultHandling.scala b/actor/src/main/scala/org/apache/pekko/actor/FaultHandling.scala
index 988b0e82c6..73b97fb7f6 100644
--- a/actor/src/main/scala/org/apache/pekko/actor/FaultHandling.scala
+++ b/actor/src/main/scala/org/apache/pekko/actor/FaultHandling.scala
@@ -244,17 +244,17 @@ object SupervisorStrategy extends SupervisorStrategyLowPriorityImplicits {
    * Implicit conversion from `Seq` of Throwables to a `Decider`.
    * This maps the given Throwables to restarts, otherwise escalates.
    */
-  implicit def seqThrowable2Decider(trapExit: immutable.Seq[Class[_ <: Throwable]]): Decider = makeDecider(trapExit)
+  implicit def seqThrowable2Decider(trapExit: immutable.Seq[Class[? <: Throwable]]): Decider = makeDecider(trapExit)
 
   type Decider = PartialFunction[Throwable, Directive]
   type JDecider = pekko.japi.function.Function[Throwable, Directive]
-  type CauseDirective = (Class[_ <: Throwable], Directive)
+  type CauseDirective = (Class[? <: Throwable], Directive)
 
   /**
    * Decider builder which just checks whether one of
    * the given Throwables matches the cause and restarts, otherwise escalates.
    */
-  def makeDecider(trapExit: immutable.Seq[Class[_ <: Throwable]]): Decider = {
+  def makeDecider(trapExit: immutable.Seq[Class[? <: Throwable]]): Decider = {
     case x => if (trapExit.exists(_.isInstance(x))) Restart else Escalate
   }
 
@@ -262,7 +262,7 @@ object SupervisorStrategy extends SupervisorStrategyLowPriorityImplicits {
    * Decider builder which just checks whether one of
    * the given Throwables matches the cause and restarts, otherwise escalates.
    */
-  def makeDecider(trapExit: JIterable[Class[_ <: Throwable]]): Decider = makeDecider(immutableSeq(trapExit))
+  def makeDecider(trapExit: JIterable[Class[? <: Throwable]]): Decider = makeDecider(immutableSeq(trapExit))
 
   /**
    * Decider builder for Iterables of cause-directive pairs, e.g. a map obtained
@@ -505,13 +505,13 @@ case class AllForOneStrategy(
   /**
    * Java API
    */
-  def this(maxNrOfRetries: Int, withinTimeRange: Duration, trapExit: JIterable[Class[_ <: Throwable]]) =
+  def this(maxNrOfRetries: Int, withinTimeRange: Duration, trapExit: JIterable[Class[? <: Throwable]]) =
     this(maxNrOfRetries, withinTimeRange)(SupervisorStrategy.makeDecider(trapExit))
 
   /**
    * Java API
    */
-  def this(maxNrOfRetries: Int, withinTimeRange: java.time.Duration, trapExit: JIterable[Class[_ <: Throwable]]) =
+  def this(maxNrOfRetries: Int, withinTimeRange: java.time.Duration, trapExit: JIterable[Class[? <: Throwable]]) =
     this(maxNrOfRetries, withinTimeRange.toScala)(SupervisorStrategy.makeDecider(trapExit))
 
   /**
@@ -618,13 +618,13 @@ case class OneForOneStrategy(
   /**
    * Java API
    */
-  def this(maxNrOfRetries: Int, withinTimeRange: Duration, trapExit: JIterable[Class[_ <: Throwable]]) =
+  def this(maxNrOfRetries: Int, withinTimeRange: Duration, trapExit: JIterable[Class[? <: Throwable]]) =
     this(maxNrOfRetries, withinTimeRange)(SupervisorStrategy.makeDecider(trapExit))
 
   /**
    * Java API
    */
-  def this(maxNrOfRetries: Int, withinTimeRange: java.time.Duration, trapExit: JIterable[Class[_ <: Throwable]]) =
+  def this(maxNrOfRetries: Int, withinTimeRange: java.time.Duration, trapExit: JIterable[Class[? <: Throwable]]) =
     this(maxNrOfRetries, withinTimeRange.toScala)(SupervisorStrategy.makeDecider(trapExit))
 
   /**
diff --git a/actor/src/main/scala/org/apache/pekko/actor/IndirectActorProducer.scala b/actor/src/main/scala/org/apache/pekko/actor/IndirectActorProducer.scala
index 0094a1d7ab..fa6ec6f4a5 100644
--- a/actor/src/main/scala/org/apache/pekko/actor/IndirectActorProducer.scala
+++ b/actor/src/main/scala/org/apache/pekko/actor/IndirectActorProducer.scala
@@ -44,7 +44,7 @@ trait IndirectActorProducer {
    * that the instance created for calling `actorClass` is not necessarily reused
    * later to produce the actor.
    */
-  def actorClass: Class[_ <: Actor]
+  def actorClass: Class[? <: Actor]
 }
 
 private[pekko] object IndirectActorProducer {
@@ -52,7 +52,7 @@ private[pekko] object IndirectActorProducer {
   val CreatorConsumerClass = classOf[CreatorConsumer]
   val TypedCreatorFunctionConsumerClass = classOf[TypedCreatorFunctionConsumer]
   @nowarn
-  def apply(clazz: Class[_], args: immutable.Seq[Any]): IndirectActorProducer = {
+  def apply(clazz: Class[?], args: immutable.Seq[Any]): IndirectActorProducer = {
     if (classOf[IndirectActorProducer].isAssignableFrom(clazz)) {
       def get1stArg[T]: T = args.head.asInstanceOf[T]
       def get2ndArg[T]: T = args.tail.head.asInstanceOf[T]
@@ -69,8 +69,8 @@ private[pekko] object IndirectActorProducer {
           Reflect.instantiate(clazz, args).asInstanceOf[IndirectActorProducer]
       }
     } else if (classOf[Actor].isAssignableFrom(clazz)) {
-      if (args.isEmpty) new NoArgsReflectConstructor(clazz.asInstanceOf[Class[_ <: Actor]])
-      else new ArgsReflectConstructor(clazz.asInstanceOf[Class[_ <: Actor]], args)
+      if (args.isEmpty) new NoArgsReflectConstructor(clazz.asInstanceOf[Class[? <: Actor]])
+      else new ArgsReflectConstructor(clazz.asInstanceOf[Class[? <: Actor]], args)
     } else throw new IllegalArgumentException(s"unknown actor creator [$clazz]")
   }
 }
@@ -86,7 +86,7 @@ private[pekko] class CreatorFunctionConsumer(creator: () => Actor) extends Indir
 /**
  * INTERNAL API
  */
-private[pekko] class CreatorConsumer(clazz: Class[_ <: Actor], creator: Creator[Actor]) extends IndirectActorProducer {
+private[pekko] class CreatorConsumer(clazz: Class[? <: Actor], creator: Creator[Actor]) extends IndirectActorProducer {
   override def actorClass = clazz
   override def produce() = creator.create()
 }
@@ -94,7 +94,7 @@ private[pekko] class CreatorConsumer(clazz: Class[_ <: Actor], creator: Creator[
 /**
  * INTERNAL API
  */
-private[pekko] class TypedCreatorFunctionConsumer(clz: Class[_ <: Actor], creator: () => Actor)
+private[pekko] class TypedCreatorFunctionConsumer(clz: Class[? <: Actor], creator: () => Actor)
     extends IndirectActorProducer {
   override def actorClass = clz
   override def produce() = creator()
@@ -103,7 +103,7 @@ private[pekko] class TypedCreatorFunctionConsumer(clz: Class[_ <: Actor], creato
 /**
  * INTERNAL API
  */
-private[pekko] class ArgsReflectConstructor(clz: Class[_ <: Actor], args: immutable.Seq[Any])
+private[pekko] class ArgsReflectConstructor(clz: Class[? <: Actor], args: immutable.Seq[Any])
     extends IndirectActorProducer {
   private[this] val constructor = Reflect.findConstructor(clz, args)
   override def actorClass = clz
@@ -113,7 +113,7 @@ private[pekko] class ArgsReflectConstructor(clz: Class[_ <: Actor], args: immuta
 /**
  * INTERNAL API
  */
-private[pekko] class NoArgsReflectConstructor(clz: Class[_ <: Actor]) extends IndirectActorProducer {
+private[pekko] class NoArgsReflectConstructor(clz: Class[? <: Actor]) extends IndirectActorProducer {
   Reflect.findConstructor(clz, List.empty)
   override def actorClass = clz
   override def produce() = Reflect.instantiate(clz)
diff --git a/actor/src/main/scala/org/apache/pekko/actor/Props.scala b/actor/src/main/scala/org/apache/pekko/actor/Props.scala
index 80637e04fe..69f2ef1f79 100644
--- a/actor/src/main/scala/org/apache/pekko/actor/Props.scala
+++ b/actor/src/main/scala/org/apache/pekko/actor/Props.scala
@@ -87,13 +87,13 @@ object Props extends AbstractProps {
   def apply[T <: Actor: ClassTag](creator: => T): Props =
     mkProps(implicitly[ClassTag[T]].runtimeClass, () => creator)
 
-  private def mkProps(classOfActor: Class[_], ctor: () => Actor): Props =
+  private def mkProps(classOfActor: Class[?], ctor: () => Actor): Props =
     Props(classOf[TypedCreatorFunctionConsumer], classOfActor, ctor)
 
   /**
    * Scala API: create a Props given a class and its constructor arguments.
    */
-  def apply(clazz: Class[_], args: Any*): Props = apply(defaultDeploy, clazz, args.toList)
+  def apply(clazz: Class[?], args: Any*): Props = apply(defaultDeploy, clazz, args.toList)
 
 }
 
@@ -121,7 +121,7 @@ object Props extends AbstractProps {
  * }}}
  */
 @SerialVersionUID(2L)
-final case class Props(deploy: Deploy, clazz: Class[_], args: immutable.Seq[Any]) {
+final case class Props(deploy: Deploy, clazz: Class[?], args: immutable.Seq[Any]) {
 
   Props.validate(clazz)
 
@@ -131,7 +131,7 @@ final case class Props(deploy: Deploy, clazz: Class[_], args: immutable.Seq[Any]
 
   // derived property, does not need to be serialized
   @transient
-  private[this] var _cachedActorClass: Class[_ <: Actor] = _
+  private[this] var _cachedActorClass: Class[? <: Actor] = _
 
   /**
    * INTERNAL API
@@ -143,7 +143,7 @@ final case class Props(deploy: Deploy, clazz: Class[_], args: immutable.Seq[Any]
     _producer
   }
 
-  private[this] def cachedActorClass: Class[_ <: Actor] = {
+  private[this] def cachedActorClass: Class[? <: Actor] = {
     if (_cachedActorClass eq null)
       _cachedActorClass = producer.actorClass
 
@@ -223,7 +223,7 @@ final case class Props(deploy: Deploy, clazz: Class[_], args: immutable.Seq[Any]
    * the actor system to select special dispatchers or mailboxes in case
    * dependencies are encoded in the actor type.
    */
-  def actorClass(): Class[_ <: Actor] = cachedActorClass
+  def actorClass(): Class[? <: Actor] = cachedActorClass
 
   /**
    * INTERNAL API
diff --git a/actor/src/main/scala/org/apache/pekko/actor/ReflectiveDynamicAccess.scala b/actor/src/main/scala/org/apache/pekko/actor/ReflectiveDynamicAccess.scala
index 1bd02406a3..a35feafce5 100644
--- a/actor/src/main/scala/org/apache/pekko/actor/ReflectiveDynamicAccess.scala
+++ b/actor/src/main/scala/org/apache/pekko/actor/ReflectiveDynamicAccess.scala
@@ -34,14 +34,14 @@ import pekko.annotation.DoNotInherit
 @DoNotInherit
 class ReflectiveDynamicAccess(val classLoader: ClassLoader) extends DynamicAccess {
 
-  override def getClassFor[T: ClassTag](fqcn: String): Try[Class[_ <: T]] =
-    Try[Class[_ <: T]] {
-      val c = Class.forName(fqcn, false, classLoader).asInstanceOf[Class[_ <: T]]
+  override def getClassFor[T: ClassTag](fqcn: String): Try[Class[? <: T]] =
+    Try[Class[? <: T]] {
+      val c = Class.forName(fqcn, false, classLoader).asInstanceOf[Class[? <: T]]
       val t = implicitly[ClassTag[T]].runtimeClass
       if (t.isAssignableFrom(c)) c else throw new ClassCastException(t.toString + " is not assignable from " + c)
     }
 
-  override def createInstanceFor[T: ClassTag](clazz: Class[_], args: immutable.Seq[(Class[_], AnyRef)]): Try[T] =
+  override def createInstanceFor[T: ClassTag](clazz: Class[?], args: immutable.Seq[(Class[?], AnyRef)]): Try[T] =
     Try {
       val types = args.map(_._1).toArray
       val values = args.map(_._2).toArray
@@ -53,7 +53,7 @@ class ReflectiveDynamicAccess(val classLoader: ClassLoader) extends DynamicAcces
       else throw new ClassCastException(clazz.getName + " is not a subtype of " + t)
     }.recover { case i: InvocationTargetException if i.getTargetException ne null => throw i.getTargetException }
 
-  override def createInstanceFor[T: ClassTag](fqcn: String, args: immutable.Seq[(Class[_], AnyRef)]): Try[T] =
+  override def createInstanceFor[T: ClassTag](fqcn: String, args: immutable.Seq[(Class[?], AnyRef)]): Try[T] =
     getClassFor(fqcn).flatMap { c =>
       createInstanceFor(c, args)
     }
diff --git a/actor/src/main/scala/org/apache/pekko/actor/dungeon/ChildrenContainer.scala b/actor/src/main/scala/org/apache/pekko/actor/dungeon/ChildrenContainer.scala
index c433d4170d..bbba764ed9 100644
--- a/actor/src/main/scala/org/apache/pekko/actor/dungeon/ChildrenContainer.scala
+++ b/actor/src/main/scala/org/apache/pekko/actor/dungeon/ChildrenContainer.scala
@@ -59,14 +59,14 @@ private[pekko] object ChildrenContainer {
   final case class Creation() extends SuspendReason with WaitingForChildren
   case object Termination extends SuspendReason
 
-  class ChildRestartsIterable(stats: immutable.Map[_, ChildStats])
+  class ChildRestartsIterable(stats: immutable.Map[?, ChildStats])
       extends PartialImmutableValuesIterable[ChildStats, ChildRestartStats] {
     override final def apply(c: ChildStats) = c.asInstanceOf[ChildRestartStats]
     override final def isDefinedAt(c: ChildStats) = c.isInstanceOf[ChildRestartStats]
     override final def valuesIterator = stats.valuesIterator
   }
 
-  class ChildrenIterable(stats: immutable.Map[_, ChildStats])
+  class ChildrenIterable(stats: immutable.Map[?, ChildStats])
       extends PartialImmutableValuesIterable[ChildStats, ActorRef] {
     override final def apply(c: ChildStats) = c.asInstanceOf[ChildRestartStats].child
     override final def isDefinedAt(c: ChildStats) = c.isInstanceOf[ChildRestartStats]
diff --git a/actor/src/main/scala/org/apache/pekko/actor/dungeon/Dispatch.scala b/actor/src/main/scala/org/apache/pekko/actor/dungeon/Dispatch.scala
index cfdd058062..03ab027db6 100644
--- a/actor/src/main/scala/org/apache/pekko/actor/dungeon/Dispatch.scala
+++ b/actor/src/main/scala/org/apache/pekko/actor/dungeon/Dispatch.scala
@@ -91,7 +91,7 @@ private[pekko] trait Dispatch { this: ActorCell =>
     // it properly in the normal way
     val actorClass = props.actorClass()
     val createMessage = mailboxType match {
-      case _: ProducesMessageQueue[_] if system.mailboxes.hasRequiredType(actorClass) =>
+      case _: ProducesMessageQueue[?] if system.mailboxes.hasRequiredType(actorClass) =>
         val req = system.mailboxes.getRequiredType(actorClass)
         if (req.isInstance(mbox.messageQueue)) Create(None)
         else {
diff --git a/actor/src/main/scala/org/apache/pekko/actor/setup/ActorSystemSetup.scala b/actor/src/main/scala/org/apache/pekko/actor/setup/ActorSystemSetup.scala
index acde21bf5d..cfc541d84f 100644
--- a/actor/src/main/scala/org/apache/pekko/actor/setup/ActorSystemSetup.scala
+++ b/actor/src/main/scala/org/apache/pekko/actor/setup/ActorSystemSetup.scala
@@ -61,7 +61,7 @@ object ActorSystemSetup {
  * Constructor is *Internal API*. Use the factory methods [[ActorSystemSetup#create]] and [[ActorSystemSetup#apply]] to create
  * instances.
  */
-final class ActorSystemSetup private[pekko] (@InternalApi private[pekko] val setups: Map[Class[_], AnyRef]) {
+final class ActorSystemSetup private[pekko] (@InternalApi private[pekko] val setups: Map[Class[?], AnyRef]) {
 
   /**
    * Java API: Extract a concrete [[pekko.actor.setup.Setup]] of type `T` if it is defined in the settings.
diff --git a/actor/src/main/scala/org/apache/pekko/dispatch/CompletionStages.scala b/actor/src/main/scala/org/apache/pekko/dispatch/CompletionStages.scala
index c46edde915..808f83016f 100644
--- a/actor/src/main/scala/org/apache/pekko/dispatch/CompletionStages.scala
+++ b/actor/src/main/scala/org/apache/pekko/dispatch/CompletionStages.scala
@@ -50,10 +50,10 @@ object CompletionStages {
    * @since 1.2.0
    */
   def find[T <: AnyRef](
-      stages: java.lang.Iterable[_ <: CompletionStage[_ <: T]],
+      stages: java.lang.Iterable[? <: CompletionStage[? <: T]],
       predicate: pekko.japi.function.Function[T, java.lang.Boolean]
   ): CompletionStage[Optional[T]] = {
-    def search(iterator: java.util.Iterator[_ <: CompletionStage[_ <: T]]): CompletionStage[Optional[T]] = {
+    def search(iterator: java.util.Iterator[? <: CompletionStage[? <: T]]): CompletionStage[Optional[T]] = {
       if (iterator.hasNext) {
         iterator.next().thenCompose { t =>
           if (predicate.apply(t)) {
@@ -79,7 +79,7 @@ object CompletionStages {
    *         with the same value or exception.
    * @since 1.2.0
    */
-  def firstCompletedOf[T <: AnyRef](stages: java.lang.Iterable[_ <: CompletionStage[_ <: T]]): CompletionStage[T] = {
+  def firstCompletedOf[T <: AnyRef](stages: java.lang.Iterable[? <: CompletionStage[? <: T]]): CompletionStage[T] = {
     val iterator = stages.iterator()
     if (!iterator.hasNext) {
       new CompletableFuture[T]() // never completes
@@ -102,7 +102,7 @@ object CompletionStages {
   }
 
   private def foldWithNext[T, R](
-      iterator: java.util.Iterator[_ <: CompletionStage[_ <: T]],
+      iterator: java.util.Iterator[? <: CompletionStage[? <: T]],
       previous: R,
       function: pekko.japi.function.Function2[R, T, R]): CompletionStage[R] = {
     if (iterator.hasNext) {
@@ -127,7 +127,7 @@ object CompletionStages {
    */
   def fold[T <: AnyRef, R](
       zero: R,
-      stages: java.lang.Iterable[_ <: CompletionStage[_ <: T]],
+      stages: java.lang.Iterable[? <: CompletionStage[? <: T]],
       function: pekko.japi.function.Function2[R, T, R]): CompletionStage[R] = {
     foldWithNext[T, R](stages.iterator(), zero, function)
   }
@@ -145,9 +145,9 @@ object CompletionStages {
    */
   @nowarn("msg=deprecated")
   def reduce[T <: AnyRef, R >: T](
-      stages: java.lang.Iterable[_ <: CompletionStage[_ <: T]],
+      stages: java.lang.Iterable[? <: CompletionStage[? <: T]],
       function: pekko.japi.function.Function2[R, T, R]): CompletionStage[R] = {
-    val iterator: java.util.Iterator[_ <: CompletionStage[_ <: T]] = stages.iterator()
+    val iterator: java.util.Iterator[? <: CompletionStage[? <: T]] = stages.iterator()
     if (iterator.hasNext) {
       iterator.next().thenCompose { v => foldWithNext[T, R](iterator, v, function) }
     } else {
@@ -165,7 +165,7 @@ object CompletionStages {
 
   private def combineNext[T](
       accumulate: CompletionStage[java.util.List[T]],
-      next: CompletionStage[_ <: T],
+      next: CompletionStage[? <: T],
       executor: Executor): CompletionStage[java.util.List[T]] = {
     if (executor eq null) {
       accumulate.thenCombine(next, addToListFunction())
@@ -185,7 +185,7 @@ object CompletionStages {
    * @since 1.2.0
    */
   def sequence[T](
-      stages: java.lang.Iterable[_ <: CompletionStage[_ <: T]],
+      stages: java.lang.Iterable[? <: CompletionStage[? <: T]],
       executor: Executor): CompletionStage[java.util.List[T]] = {
     var result: CompletionStage[java.util.List[T]] = CompletableFuture.completedFuture(new java.util.ArrayList[T]())
     val iterator = stages.iterator()
diff --git a/actor/src/main/scala/org/apache/pekko/dispatch/ForkJoinExecutorConfigurator.scala b/actor/src/main/scala/org/apache/pekko/dispatch/ForkJoinExecutorConfigurator.scala
index 7135594d35..ff500c16ac 100644
--- a/actor/src/main/scala/org/apache/pekko/dispatch/ForkJoinExecutorConfigurator.scala
+++ b/actor/src/main/scala/org/apache/pekko/dispatch/ForkJoinExecutorConfigurator.scala
@@ -60,7 +60,7 @@ object ForkJoinExecutorConfigurator {
     override def execute(r: Runnable): Unit =
       if (r ne null)
         super.execute(
-          (if (r.isInstanceOf[ForkJoinTask[_]]) r else new PekkoForkJoinTask(r)).asInstanceOf[ForkJoinTask[Any]])
+          (if (r.isInstanceOf[ForkJoinTask[?]]) r else new PekkoForkJoinTask(r)).asInstanceOf[ForkJoinTask[Any]])
       else
         throw new NullPointerException("Runnable was null")
 
diff --git a/actor/src/main/scala/org/apache/pekko/dispatch/Mailboxes.scala b/actor/src/main/scala/org/apache/pekko/dispatch/Mailboxes.scala
index f3b30140e6..f255eb832d 100644
--- a/actor/src/main/scala/org/apache/pekko/dispatch/Mailboxes.scala
+++ b/actor/src/main/scala/org/apache/pekko/dispatch/Mailboxes.scala
@@ -73,7 +73,7 @@ private[pekko] class Mailboxes(
 
   private val mailboxTypeConfigurators = new ConcurrentHashMap[String, MailboxType]
 
-  private val mailboxBindings: Map[Class[_ <: Any], String] = {
+  private val mailboxBindings: Map[Class[? <: Any], String] = {
     import scala.jdk.CollectionConverters._
     settings.config
       .getConfig("pekko.actor.mailbox.requirements")
@@ -81,7 +81,7 @@ private[pekko] class Mailboxes(
       .unwrapped
       .asScala
       .toMap
-      .foldLeft(Map.empty[Class[_ <: Any], String]) {
+      .foldLeft(Map.empty[Class[? <: Any], String]) {
         case (m, (k, v)) =>
           dynamicAccess
             .getClassFor[Any](k)
@@ -107,18 +107,18 @@ private[pekko] class Mailboxes(
   /**
    * Returns a mailbox type as specified in configuration, based on the type, or if not defined None.
    */
-  def lookupByQueueType(queueType: Class[_ <: Any]): MailboxType = lookup(lookupId(queueType))
+  def lookupByQueueType(queueType: Class[? <: Any]): MailboxType = lookup(lookupId(queueType))
 
-  private final val rmqClass = classOf[RequiresMessageQueue[_]]
+  private final val rmqClass = classOf[RequiresMessageQueue[?]]
 
   /**
    * Return the required message queue type for this class if any.
    */
-  def getRequiredType(actorClass: Class[_ <: Actor]): Class[_] =
+  def getRequiredType(actorClass: Class[? <: Actor]): Class[?] =
     Reflect.findMarker(actorClass, rmqClass) match {
       case t: ParameterizedType =>
         t.getActualTypeArguments.head match {
-          case c: Class[_] => c
+          case c: Class[?] => c
           case x           =>
             throw new IllegalArgumentException(s"no wildcard type allowed in RequireMessageQueue argument (was [$x])")
         }
@@ -135,14 +135,14 @@ private[pekko] class Mailboxes(
     case x                    => dynamicAccess.getClassFor[AnyRef](x).get
   }
 
-  def getProducedMessageQueueType(mailboxType: MailboxType): Class[_] = {
-    val pmqClass = classOf[ProducesMessageQueue[_]]
+  def getProducedMessageQueueType(mailboxType: MailboxType): Class[?] = {
+    val pmqClass = classOf[ProducesMessageQueue[?]]
     if (!pmqClass.isAssignableFrom(mailboxType.getClass)) classOf[MessageQueue]
     else
       Reflect.findMarker(mailboxType.getClass, pmqClass) match {
         case t: ParameterizedType =>
           t.getActualTypeArguments.head match {
-            case c: Class[_] => c
+            case c: Class[?] => c
             case x           =>
               throw new IllegalArgumentException(
                 s"no wildcard type allowed in ProducesMessageQueue argument (was [$x])")
@@ -161,7 +161,7 @@ private[pekko] class Mailboxes(
     val actorClass = props.actorClass()
     lazy val actorRequirement = getRequiredType(actorClass)
 
-    val mailboxRequirement: Class[_] = getMailboxRequirement(dispatcherConfig)
+    val mailboxRequirement: Class[?] = getMailboxRequirement(dispatcherConfig)
 
     val hasMailboxRequirement: Boolean = mailboxRequirement != classOf[MessageQueue]
 
@@ -180,7 +180,7 @@ private[pekko] class Mailboxes(
     }
 
     def verifyRequirements(mailboxType: MailboxType): MailboxType = {
-      lazy val mqType: Class[_] = getProducedMessageQueueType(mailboxType)
+      lazy val mqType: Class[?] = getProducedMessageQueueType(mailboxType)
       if (hasMailboxRequirement && !mailboxRequirement.isAssignableFrom(mqType))
         throw new IllegalArgumentException(
           s"produced message queue type [$mqType] does not fulfill requirement for dispatcher [$id]. " +
@@ -214,9 +214,9 @@ private[pekko] class Mailboxes(
   /**
    * Check if this class can have a required message queue type.
    */
-  def hasRequiredType(actorClass: Class[_ <: Actor]): Boolean = rmqClass.isAssignableFrom(actorClass)
+  def hasRequiredType(actorClass: Class[? <: Actor]): Boolean = rmqClass.isAssignableFrom(actorClass)
 
-  private def lookupId(queueType: Class[_]): String =
+  private def lookupId(queueType: Class[?]): String =
     mailboxBindings.get(queueType) match {
       case None    => throw new ConfigurationException(s"Mailbox Mapping for [$queueType] not configured")
       case Some(s) => s
diff --git a/actor/src/main/scala/org/apache/pekko/dispatch/ThreadPoolBuilder.scala b/actor/src/main/scala/org/apache/pekko/dispatch/ThreadPoolBuilder.scala
index e1321c7cab..20e69a1f23 100644
--- a/actor/src/main/scala/org/apache/pekko/dispatch/ThreadPoolBuilder.scala
+++ b/actor/src/main/scala/org/apache/pekko/dispatch/ThreadPoolBuilder.scala
@@ -297,14 +297,14 @@ trait ExecutorServiceDelegate extends ExecutorService {
 
   def submit(runnable: Runnable) = executor.submit(runnable)
 
-  def invokeAll[T](callables: Collection[_ <: Callable[T]]) = executor.invokeAll(callables)
+  def invokeAll[T](callables: Collection[? <: Callable[T]]) = executor.invokeAll(callables)
 
-  def invokeAll[T](callables: Collection[_ <: Callable[T]], l: Long, timeUnit: TimeUnit) =
+  def invokeAll[T](callables: Collection[? <: Callable[T]], l: Long, timeUnit: TimeUnit) =
     executor.invokeAll(callables, l, timeUnit)
 
-  def invokeAny[T](callables: Collection[_ <: Callable[T]]) = executor.invokeAny(callables)
+  def invokeAny[T](callables: Collection[? <: Callable[T]]) = executor.invokeAny(callables)
 
-  def invokeAny[T](callables: Collection[_ <: Callable[T]], l: Long, timeUnit: TimeUnit) =
+  def invokeAny[T](callables: Collection[? <: Callable[T]], l: Long, timeUnit: TimeUnit) =
     executor.invokeAny(callables, l, timeUnit)
 }
 
diff --git a/actor/src/main/scala/org/apache/pekko/dispatch/VirtualizedExecutorService.scala b/actor/src/main/scala/org/apache/pekko/dispatch/VirtualizedExecutorService.scala
index be6cf1b0a3..160224cb04 100644
--- a/actor/src/main/scala/org/apache/pekko/dispatch/VirtualizedExecutorService.scala
+++ b/actor/src/main/scala/org/apache/pekko/dispatch/VirtualizedExecutorService.scala
@@ -141,24 +141,24 @@ final class VirtualizedExecutorService(
     executor.submit(task, result)
   }
 
-  override def submit(task: Runnable): Future[_] = {
+  override def submit(task: Runnable): Future[?] = {
     executor.submit(task)
   }
 
-  override def invokeAll[T](tasks: util.Collection[_ <: Callable[T]]): util.List[Future[T]] = {
+  override def invokeAll[T](tasks: util.Collection[? <: Callable[T]]): util.List[Future[T]] = {
     executor.invokeAll(tasks)
   }
 
   override def invokeAll[T](
-      tasks: util.Collection[_ <: Callable[T]], timeout: Long, unit: TimeUnit): util.List[Future[T]] = {
+      tasks: util.Collection[? <: Callable[T]], timeout: Long, unit: TimeUnit): util.List[Future[T]] = {
     executor.invokeAll(tasks, timeout, unit)
   }
 
-  override def invokeAny[T](tasks: util.Collection[_ <: Callable[T]]): T = {
+  override def invokeAny[T](tasks: util.Collection[? <: Callable[T]]): T = {
     executor.invokeAny(tasks)
   }
 
-  override def invokeAny[T](tasks: util.Collection[_ <: Callable[T]], timeout: Long, unit: TimeUnit): T = {
+  override def invokeAny[T](tasks: util.Collection[? <: Callable[T]], timeout: Long, unit: TimeUnit): T = {
     executor.invokeAny(tasks, timeout, unit)
   }
 
diff --git a/actor/src/main/scala/org/apache/pekko/event/EventStream.scala b/actor/src/main/scala/org/apache/pekko/event/EventStream.scala
index 0822f39e57..8e777f1870 100644
--- a/actor/src/main/scala/org/apache/pekko/event/EventStream.scala
+++ b/actor/src/main/scala/org/apache/pekko/event/EventStream.scala
@@ -36,24 +36,24 @@ class EventStream(sys: ActorSystem, private val debug: Boolean) extends LoggingB
   def this(sys: ActorSystem) = this(sys, debug = false)
 
   type Event = Any
-  type Classifier = Class[_]
+  type Classifier = Class[?]
 
   /** Either the list of subscribed actors, or a ref to a [[pekko.event.EventStreamUnsubscriber]] */
   private val initiallySubscribedOrUnsubscriber = new AtomicReference[Either[Set[ActorRef], ActorRef]](Left(Set.empty))
 
-  protected implicit val subclassification: Subclassification[Classifier] = new Subclassification[Class[_]] {
-    def isEqual(x: Class[_], y: Class[_]) = x == y
-    def isSubclass(x: Class[_], y: Class[_]) = y.isAssignableFrom(x)
+  protected implicit val subclassification: Subclassification[Classifier] = new Subclassification[Class[?]] {
+    def isEqual(x: Class[?], y: Class[?]) = x == y
+    def isSubclass(x: Class[?], y: Class[?]) = y.isAssignableFrom(x)
   }
 
-  protected def classify(event: Any): Class[_] = event.getClass
+  protected def classify(event: Any): Class[?] = event.getClass
 
   protected def publish(event: Any, subscriber: ActorRef) = {
     if ((sys eq null) && subscriber.isTerminated) unsubscribe(subscriber)
     else subscriber ! event
   }
 
-  override def subscribe(subscriber: ActorRef, channel: Class[_]): Boolean = {
+  override def subscribe(subscriber: ActorRef, channel: Class[?]): Boolean = {
     if (subscriber eq null) throw new IllegalArgumentException("subscriber is null")
     if (debug)
       publish(Logging.Debug(simpleName(this), this.getClass, "subscribing " + subscriber + " to channel " + channel))
@@ -61,7 +61,7 @@ class EventStream(sys: ActorSystem, private val debug: Boolean) extends LoggingB
     super.subscribe(subscriber, channel)
   }
 
-  override def unsubscribe(subscriber: ActorRef, channel: Class[_]): Boolean = {
+  override def unsubscribe(subscriber: ActorRef, channel: Class[?]): Boolean = {
     if (subscriber eq null) throw new IllegalArgumentException("subscriber is null")
     val ret = super.unsubscribe(subscriber, channel)
     unregisterIfNoMoreSubscribedChannels(subscriber)
diff --git a/actor/src/main/scala/org/apache/pekko/event/Logging.scala b/actor/src/main/scala/org/apache/pekko/event/Logging.scala
index d7b4c8fbc2..7a1ef23063 100644
--- a/actor/src/main/scala/org/apache/pekko/event/Logging.scala
+++ b/actor/src/main/scala/org/apache/pekko/event/Logging.scala
@@ -45,7 +45,7 @@ import pekko.util.Timeout
 trait LoggingBus extends ActorEventBus {
 
   type Event >: Logging.LogEvent
-  type Classifier >: Class[_]
+  type Classifier >: Class[?]
 
   import Logging._
 
@@ -216,7 +216,7 @@ trait LoggingBus extends ActorEventBus {
    */
   private def addLogger(
       system: ActorSystemImpl,
-      clazz: Class[_ <: Actor],
+      clazz: Class[? <: Actor],
       level: LogLevel,
       logName: String): ActorRef = {
     val name = "log" + LogExt(system).id() + "-" + simpleName(clazz)
@@ -291,13 +291,13 @@ trait LoggingBus extends ActorEventBus {
     -T] {
   def genString(t: T): String
   def genString(t: T, @nowarn("msg=never used") system: ActorSystem): String = genString(t)
-  def getClazz(t: T): Class[_] = t.getClass
+  def getClazz(t: T): Class[?] = t.getClass
 }
 
 /**
  * INTERNAL API
  */
-@InternalApi private[pekko] final case class ActorWithLogClass(actor: Actor, logClass: Class[_])
+@InternalApi private[pekko] final case class ActorWithLogClass(actor: Actor, logClass: Class[?])
 
 /**
  * This is a “marker” class which is inserted as originator class into
@@ -355,14 +355,14 @@ object LogSource {
     new LogSource[ActorWithLogClass] {
       def genString(a: ActorWithLogClass) = fromActor.genString(a.actor)
       override def genString(a: ActorWithLogClass, system: ActorSystem) = fromActor.genString(a.actor, system)
-      override def getClazz(a: ActorWithLogClass): Class[_] = a.logClass
+      override def getClazz(a: ActorWithLogClass): Class[?] = a.logClass
     }
 
   // this one unfortunately does not work as implicit, because existential types have some weird behavior
-  val fromClass: LogSource[Class[_]] = new LogSource[Class[_]] {
-    def genString(c: Class[_]): String = Logging.simpleName(c)
-    override def genString(c: Class[_], system: ActorSystem): String = genString(c) + "(" + system + ")"
-    override def getClazz(c: Class[_]): Class[_] = c
+  val fromClass: LogSource[Class[?]] = new LogSource[Class[?]] {
+    def genString(c: Class[?]): String = Logging.simpleName(c)
+    override def genString(c: Class[?], system: ActorSystem): String = genString(c) + "(" + system + ")"
+    override def getClazz(c: Class[?]): Class[?] = c
   }
   implicit def fromAnyClass[T]: LogSource[Class[T]] = fromClass.asInstanceOf[LogSource[Class[T]]]
 
@@ -370,7 +370,7 @@ object LogSource {
    * Convenience converter access: given an implicit `LogSource`, generate the
    * string representation and originating class.
    */
-  def apply[T: LogSource](o: T): (String, Class[_]) = {
+  def apply[T: LogSource](o: T): (String, Class[?]) = {
     val ls = implicitly[LogSource[T]]
     (ls.genString(o), ls.getClazz(o))
   }
@@ -380,7 +380,7 @@ object LogSource {
    * [[pekko.actor.ActorSystem]], generate the string representation and
    * originating class.
    */
-  def apply[T: LogSource](o: T, system: ActorSystem): (String, Class[_]) = {
+  def apply[T: LogSource](o: T, system: ActorSystem): (String, Class[?]) = {
     val ls = implicitly[LogSource[T]]
     (ls.genString(o, system), ls.getClazz(o))
   }
@@ -389,9 +389,9 @@ object LogSource {
    * construct string representation for any object according to
    * rules above with fallback to its `Class`’s simple name.
    */
-  def fromAnyRef(o: AnyRef): (String, Class[_]) =
+  def fromAnyRef(o: AnyRef): (String, Class[?]) =
     o match {
-      case c: Class[_] => apply(c)
+      case c: Class[?] => apply(c)
       case a: Actor    => apply(a)
       case a: ActorRef => apply(a)
       case s: String   => apply(s)
@@ -403,9 +403,9 @@ object LogSource {
    * rules above (including the actor system’s address) with fallback to its
    * `Class`’s simple name.
    */
-  def fromAnyRef(o: AnyRef, system: ActorSystem): (String, Class[_]) =
+  def fromAnyRef(o: AnyRef, system: ActorSystem): (String, Class[?]) =
     o match {
-      case c: Class[_] => apply(c)
+      case c: Class[?] => apply(c)
       case a: Actor    => apply(a)
       case a: ActorRef => apply(a)
       case s: String   => apply(s)
@@ -458,7 +458,7 @@ object Logging {
    * Returns a 'safe' getSimpleName for the provided Class
    * @return the simple name of the given Class
    */
-  def simpleName(clazz: Class[_]): String = {
+  def simpleName(clazz: Class[?]): String = {
     val n = clazz.getName
     val i = n.lastIndexOf('.')
     n.substring(i + 1)
@@ -539,7 +539,7 @@ object Logging {
    * Returns the LogLevel associated with the given event class.
    * Defaults to DebugLevel.
    */
-  def levelFor(eventClass: Class[_ <: LogEvent]): LogLevel = {
+  def levelFor(eventClass: Class[? <: LogEvent]): LogLevel = {
     if (classOf[Error].isAssignableFrom(eventClass)) ErrorLevel
     else if (classOf[Warning].isAssignableFrom(eventClass)) WarningLevel
     else if (classOf[Info].isAssignableFrom(eventClass)) InfoLevel
@@ -550,7 +550,7 @@ object Logging {
   /**
    * Returns the event class associated with the given LogLevel
    */
-  def classFor(level: LogLevel): Class[_ <: LogEvent] = level match {
+  def classFor(level: LogLevel): Class[? <: LogEvent] = level match {
     case ErrorLevel   => classOf[Error]
     case WarningLevel => classOf[Warning]
     case InfoLevel    => classOf[Info]
@@ -758,7 +758,7 @@ object Logging {
     /**
      * The class of the source of this event
      */
-    def logClass: Class[_]
+    def logClass: Class[?]
 
     /**
      * The message, may be any object or null.
@@ -780,7 +780,7 @@ object Logging {
   }
 
   object LogEvent {
-    def apply(level: LogLevel, logSource: String, logClass: Class[_], message: Any): LogEvent = level match {
+    def apply(level: LogLevel, logSource: String, logClass: Class[?], message: Any): LogEvent = level match {
       case ErrorLevel   => Error(logSource, logClass, message)
       case WarningLevel => Warning(logSource, logClass, message)
       case InfoLevel    => Info(logSource, logClass, message)
@@ -788,7 +788,7 @@ object Logging {
       case level        => throw new IllegalArgumentException(s"Unsupported log level [$level]")
     }
 
-    def apply(level: LogLevel, logSource: String, logClass: Class[_], message: Any, mdc: MDC): LogEvent = level match {
+    def apply(level: LogLevel, logSource: String, logClass: Class[?], message: Any, mdc: MDC): LogEvent = level match {
       case ErrorLevel   => Error(logSource, logClass, message, mdc)
       case WarningLevel => Warning(logSource, logClass, message, mdc)
       case InfoLevel    => Info(logSource, logClass, message, mdc)
@@ -799,7 +799,7 @@ object Logging {
     def apply(
         level: LogLevel,
         logSource: String,
-        logClass: Class[_],
+        logClass: Class[?],
         message: Any,
         mdc: MDC,
         marker: LogMarker): LogEvent = level match {
@@ -819,49 +819,49 @@ object Logging {
   /**
    * For ERROR Logging
    */
-  case class Error(override val cause: Throwable, logSource: String, logClass: Class[_], message: Any = "")
+  case class Error(override val cause: Throwable, logSource: String, logClass: Class[?], message: Any = "")
       extends LogEvent
       with LogEventWithCause {
-    def this(logSource: String, logClass: Class[_], message: Any) = this(Error.NoCause, logSource, logClass, message)
+    def this(logSource: String, logClass: Class[?], message: Any) = this(Error.NoCause, logSource, logClass, message)
     override def level = ErrorLevel
   }
   class Error2(
       override val cause: Throwable,
       logSource: String,
-      logClass: Class[_],
+      logClass: Class[?],
       message: Any = "",
       override val mdc: MDC)
       extends Error(cause, logSource, logClass, message) {
-    def this(logSource: String, logClass: Class[_], message: Any, mdc: MDC) =
+    def this(logSource: String, logClass: Class[?], message: Any, mdc: MDC) =
       this(Error.NoCause, logSource, logClass, message, mdc)
   }
   class Error3(
       override val cause: Throwable,
       logSource: String,
-      logClass: Class[_],
+      logClass: Class[?],
       message: Any,
       override val mdc: MDC,
       override val marker: LogMarker)
       extends Error2(cause, logSource, logClass, message, mdc)
       with LogEventWithMarker {
-    def this(logSource: String, logClass: Class[_], message: Any, mdc: MDC, marker: LogMarker) =
+    def this(logSource: String, logClass: Class[?], message: Any, mdc: MDC, marker: LogMarker) =
       this(Error.NoCause, logSource, logClass, message, mdc, marker)
   }
 
   object Error {
-    def apply(logSource: String, logClass: Class[_], message: Any) =
+    def apply(logSource: String, logClass: Class[?], message: Any) =
       new Error(NoCause, logSource, logClass, message)
-    def apply(logSource: String, logClass: Class[_], message: Any, marker: LogMarker) =
+    def apply(logSource: String, logClass: Class[?], message: Any, marker: LogMarker) =
       new Error3(NoCause, logSource, logClass, message, Map.empty, marker)
 
-    def apply(cause: Throwable, logSource: String, logClass: Class[_], message: Any, mdc: MDC) =
+    def apply(cause: Throwable, logSource: String, logClass: Class[?], message: Any, mdc: MDC) =
       new Error2(cause, logSource, logClass, message, mdc)
-    def apply(cause: Throwable, logSource: String, logClass: Class[_], message: Any, mdc: MDC, marker: LogMarker) =
+    def apply(cause: Throwable, logSource: String, logClass: Class[?], message: Any, mdc: MDC, marker: LogMarker) =
       new Error3(cause, logSource, logClass, message, mdc, marker)
 
-    def apply(logSource: String, logClass: Class[_], message: Any, mdc: MDC) =
+    def apply(logSource: String, logClass: Class[?], message: Any, mdc: MDC) =
       new Error2(NoCause, logSource, logClass, message, mdc)
-    def apply(logSource: String, logClass: Class[_], message: Any, mdc: MDC, marker: LogMarker) =
+    def apply(logSource: String, logClass: Class[?], message: Any, mdc: MDC, marker: LogMarker) =
       new Error3(NoCause, logSource, logClass, message, mdc, marker)
 
     /** Null Object used for errors without cause Throwable */
@@ -872,14 +872,14 @@ object Logging {
   /**
    * For WARNING Logging
    */
-  case class Warning(logSource: String, logClass: Class[_], message: Any = "") extends LogEvent {
+  case class Warning(logSource: String, logClass: Class[?], message: Any = "") extends LogEvent {
     override def level = WarningLevel
   }
-  class Warning2(logSource: String, logClass: Class[_], message: Any, override val mdc: MDC)
+  class Warning2(logSource: String, logClass: Class[?], message: Any, override val mdc: MDC)
       extends Warning(logSource, logClass, message)
   class Warning3(
       logSource: String,
-      logClass: Class[_],
+      logClass: Class[?],
       message: Any,
       override val mdc: MDC,
       override val marker: LogMarker)
@@ -887,7 +887,7 @@ object Logging {
       with LogEventWithMarker
   class Warning4(
       logSource: String,
-      logClass: Class[_],
+      logClass: Class[?],
       message: Any,
       override val mdc: MDC,
       override val marker: LogMarker,
@@ -896,60 +896,60 @@ object Logging {
       with LogEventWithMarker
       with LogEventWithCause
   object Warning {
-    def apply(logSource: String, logClass: Class[_], message: Any, mdc: MDC) =
+    def apply(logSource: String, logClass: Class[?], message: Any, mdc: MDC) =
       new Warning2(logSource, logClass, message, mdc)
-    def apply(logSource: String, logClass: Class[_], message: Any, mdc: MDC, marker: LogMarker) =
+    def apply(logSource: String, logClass: Class[?], message: Any, mdc: MDC, marker: LogMarker) =
       new Warning3(logSource, logClass, message, mdc, marker)
 
-    def apply(cause: Throwable, logSource: String, logClass: Class[_], message: Any, mdc: MDC) =
+    def apply(cause: Throwable, logSource: String, logClass: Class[?], message: Any, mdc: MDC) =
       new Warning4(logSource, logClass, message, mdc, null, cause)
-    def apply(cause: Throwable, logSource: String, logClass: Class[_], message: Any, mdc: MDC, marker: LogMarker) =
+    def apply(cause: Throwable, logSource: String, logClass: Class[?], message: Any, mdc: MDC, marker: LogMarker) =
       new Warning4(logSource, logClass, message, mdc, marker, cause)
   }
 
   /**
    * For INFO Logging
    */
-  case class Info(logSource: String, logClass: Class[_], message: Any = "") extends LogEvent {
+  case class Info(logSource: String, logClass: Class[?], message: Any = "") extends LogEvent {
     override def level = InfoLevel
   }
-  class Info2(logSource: String, logClass: Class[_], message: Any, override val mdc: MDC)
+  class Info2(logSource: String, logClass: Class[?], message: Any, override val mdc: MDC)
       extends Info(logSource, logClass, message)
   class Info3(
       logSource: String,
-      logClass: Class[_],
+      logClass: Class[?],
       message: Any,
       override val mdc: MDC,
       override val marker: LogMarker)
       extends Info2(logSource, logClass, message, mdc)
       with LogEventWithMarker
   object Info {
-    def apply(logSource: String, logClass: Class[_], message: Any, mdc: MDC) =
+    def apply(logSource: String, logClass: Class[?], message: Any, mdc: MDC) =
       new Info2(logSource, logClass, message, mdc)
-    def apply(logSource: String, logClass: Class[_], message: Any, mdc: MDC, marker: LogMarker) =
+    def apply(logSource: String, logClass: Class[?], message: Any, mdc: MDC, marker: LogMarker) =
       new Info3(logSource, logClass, message, mdc, marker)
   }
 
   /**
    * For DEBUG Logging
    */
-  case class Debug(logSource: String, logClass: Class[_], message: Any = "") extends LogEvent {
+  case class Debug(logSource: String, logClass: Class[?], message: Any = "") extends LogEvent {
     override def level = DebugLevel
   }
-  class Debug2(logSource: String, logClass: Class[_], message: Any, override val mdc: MDC)
+  class Debug2(logSource: String, logClass: Class[?], message: Any, override val mdc: MDC)
       extends Debug(logSource, logClass, message)
   class Debug3(
       logSource: String,
-      logClass: Class[_],
+      logClass: Class[?],
       message: Any,
       override val mdc: MDC,
       override val marker: LogMarker)
       extends Debug2(logSource, logClass, message, mdc)
       with LogEventWithMarker
   object Debug {
-    def apply(logSource: String, logClass: Class[_], message: Any, mdc: MDC) =
+    def apply(logSource: String, logClass: Class[?], message: Any, mdc: MDC) =
       new Debug2(logSource, logClass, message, mdc)
-    def apply(logSource: String, logClass: Class[_], message: Any, mdc: MDC, marker: LogMarker) =
+    def apply(logSource: String, logClass: Class[?], message: Any, mdc: MDC, marker: LogMarker) =
       new Debug3(logSource, logClass, message, mdc, marker)
   }
 
@@ -1530,8 +1530,8 @@ trait LoggingAdapter {
    * there are more than four arguments.
    */
   private def format1(t: String, arg: Any): String = arg match {
-    case a: Array[_] if !a.getClass.getComponentType.isPrimitive => formatImpl(t, a.toSeq)
-    case a: Array[_]                                             => formatImpl(t, a.toSeq.asInstanceOf[Seq[AnyRef]])
+    case a: Array[?] if !a.getClass.getComponentType.isPrimitive => formatImpl(t, a.toSeq)
+    case a: Array[?]                                             => formatImpl(t, a.toSeq.asInstanceOf[Seq[AnyRef]])
     case x                                                       => format(t, x)
   }
 
@@ -1571,10 +1571,10 @@ trait LoggingAdapter {
  */
 trait LoggingFilter {
   // for backward-compatibility reason implementation of method without marker only must work
-  def isErrorEnabled(logClass: Class[_], logSource: String): Boolean
-  def isWarningEnabled(logClass: Class[_], logSource: String): Boolean
-  def isInfoEnabled(logClass: Class[_], logSource: String): Boolean
-  def isDebugEnabled(logClass: Class[_], logSource: String): Boolean
+  def isErrorEnabled(logClass: Class[?], logSource: String): Boolean
+  def isWarningEnabled(logClass: Class[?], logSource: String): Boolean
+  def isInfoEnabled(logClass: Class[?], logSource: String): Boolean
+  def isDebugEnabled(logClass: Class[?], logSource: String): Boolean
 }
 
 /**
@@ -1583,13 +1583,13 @@ trait LoggingFilter {
  */
 @nowarn("msg=never us")
 trait LoggingFilterWithMarker extends LoggingFilter {
-  def isErrorEnabled(logClass: Class[_], logSource: String, marker: LogMarker): Boolean =
+  def isErrorEnabled(logClass: Class[?], logSource: String, marker: LogMarker): Boolean =
     isErrorEnabled(logClass, logSource)
-  def isWarningEnabled(logClass: Class[_], logSource: String, marker: LogMarker): Boolean =
+  def isWarningEnabled(logClass: Class[?], logSource: String, marker: LogMarker): Boolean =
     isWarningEnabled(logClass, logSource)
-  def isInfoEnabled(logClass: Class[_], logSource: String, marker: LogMarker): Boolean =
+  def isInfoEnabled(logClass: Class[?], logSource: String, marker: LogMarker): Boolean =
     isInfoEnabled(logClass, logSource)
-  def isDebugEnabled(logClass: Class[_], logSource: String, marker: LogMarker): Boolean =
+  def isDebugEnabled(logClass: Class[?], logSource: String, marker: LogMarker): Boolean =
     isDebugEnabled(logClass, logSource)
 }
 
@@ -1602,13 +1602,13 @@ object LoggingFilterWithMarker {
 }
 
 class LoggingFilterWithMarkerWrapper(loggingFilter: LoggingFilter) extends LoggingFilterWithMarker {
-  override def isErrorEnabled(logClass: Class[_], logSource: String): Boolean =
+  override def isErrorEnabled(logClass: Class[?], logSource: String): Boolean =
     loggingFilter.isErrorEnabled(logClass, logSource)
-  override def isWarningEnabled(logClass: Class[_], logSource: String): Boolean =
+  override def isWarningEnabled(logClass: Class[?], logSource: String): Boolean =
     loggingFilter.isWarningEnabled(logClass, logSource)
-  override def isInfoEnabled(logClass: Class[_], logSource: String): Boolean =
+  override def isInfoEnabled(logClass: Class[?], logSource: String): Boolean =
     loggingFilter.isInfoEnabled(logClass, logSource)
-  override def isDebugEnabled(logClass: Class[_], logSource: String): Boolean =
+  override def isDebugEnabled(logClass: Class[?], logSource: String): Boolean =
     loggingFilter.isDebugEnabled(logClass, logSource)
 }
 
@@ -1622,10 +1622,10 @@ class DefaultLoggingFilter(logLevel: () => Logging.LogLevel) extends LoggingFilt
   def this(settings: Settings, eventStream: EventStream) = this(() => eventStream.logLevel)
 
   import Logging._
-  def isErrorEnabled(logClass: Class[_], logSource: String) = logLevel() >= ErrorLevel
-  def isWarningEnabled(logClass: Class[_], logSource: String) = logLevel() >= WarningLevel
-  def isInfoEnabled(logClass: Class[_], logSource: String) = logLevel() >= InfoLevel
-  def isDebugEnabled(logClass: Class[_], logSource: String) = logLevel() >= DebugLevel
+  def isErrorEnabled(logClass: Class[?], logSource: String) = logLevel() >= ErrorLevel
+  def isWarningEnabled(logClass: Class[?], logSource: String) = logLevel() >= WarningLevel
+  def isInfoEnabled(logClass: Class[?], logSource: String) = logLevel() >= InfoLevel
+  def isDebugEnabled(logClass: Class[?], logSource: String) = logLevel() >= DebugLevel
 }
 
 /**
@@ -1747,14 +1747,14 @@ object LogMarker {
 class MarkerLoggingAdapter(
     override val bus: LoggingBus,
     override val logSource: String,
-    override val logClass: Class[_],
+    override val logClass: Class[?],
     loggingFilter: LoggingFilter)
     extends BusLogging(bus, logSource, logClass, loggingFilter) {
   // TODO when breaking binary compatibility, these marker methods should become baked into LoggingAdapter itself
 
   // For backwards compatibility, and when LoggingAdapter is created without direct
   // association to an ActorSystem
-  def this(bus: LoggingBus, logSource: String, logClass: Class[_]) =
+  def this(bus: LoggingBus, logSource: String, logClass: Class[?]) =
     this(bus, logSource, logClass, new DefaultLoggingFilter(() => bus.logLevel))
 
   val loggingFilterWithMarker: LoggingFilterWithMarker = LoggingFilterWithMarker.wrap(loggingFilter)
@@ -2002,8 +2002,8 @@ class MarkerLoggingAdapter(
 
   // Copy of LoggingAdapter.format1 due to binary compatibility restrictions
   private def format1(t: String, arg: Any): String = arg match {
-    case a: Array[_] if !a.getClass.getComponentType.isPrimitive => format(t, a.toIndexedSeq)
-    case a: Array[_]                                             => format(t, a.toIndexedSeq.asInstanceOf[IndexedSeq[AnyRef]])
+    case a: Array[?] if !a.getClass.getComponentType.isPrimitive => format(t, a.toIndexedSeq)
+    case a: Array[?]                                             => format(t, a.toIndexedSeq.asInstanceOf[IndexedSeq[AnyRef]])
     case x                                                       => format(t, x)
   }
 }
@@ -2011,7 +2011,7 @@ class MarkerLoggingAdapter(
 final class DiagnosticMarkerBusLoggingAdapter(
     override val bus: LoggingBus,
     override val logSource: String,
-    override val logClass: Class[_],
+    override val logClass: Class[?],
     loggingFilter: LoggingFilter)
     extends MarkerLoggingAdapter(bus, logSource, logClass, loggingFilter)
     with DiagnosticLoggingAdapter
@@ -2019,12 +2019,12 @@ final class DiagnosticMarkerBusLoggingAdapter(
 /**
  * [[pekko.event.LoggingAdapter]] that publishes [[pekko.event.Logging.LogEvent]] to event stream.
  */
-class BusLogging(val bus: LoggingBus, val logSource: String, val logClass: Class[_], loggingFilter: LoggingFilter)
+class BusLogging(val bus: LoggingBus, val logSource: String, val logClass: Class[?], loggingFilter: LoggingFilter)
     extends LoggingAdapter {
 
   // For backwards compatibility, and when LoggingAdapter is created without direct
   // association to an ActorSystem
-  def this(bus: LoggingBus, logSource: String, logClass: Class[_]) =
+  def this(bus: LoggingBus, logSource: String, logClass: Class[?]) =
     this(bus, logSource, logClass, new DefaultLoggingFilter(() => bus.logLevel))
 
   import Logging._
diff --git a/actor/src/main/scala/org/apache/pekko/io/DnsProvider.scala b/actor/src/main/scala/org/apache/pekko/io/DnsProvider.scala
index 864f1bbf40..5fe606224f 100644
--- a/actor/src/main/scala/org/apache/pekko/io/DnsProvider.scala
+++ b/actor/src/main/scala/org/apache/pekko/io/DnsProvider.scala
@@ -35,12 +35,12 @@ private[pekko] trait DnsProvider {
    * DNS resolver actor. Should respond to [[pekko.io.dns.DnsProtocol.Resolve]] with
    * [[pekko.io.dns.DnsProtocol.Resolved]]
    */
-  def actorClass: Class[_ <: Actor]
+  def actorClass: Class[? <: Actor]
 
   /**
    * DNS manager class. Is responsible for creating resolvers and doing any cache cleanup.
    * The DNS extension will create one of these Actors. It should have a ctr that accepts
    * a [[DnsExt]]
    */
-  def managerClass: Class[_ <: Actor]
+  def managerClass: Class[? <: Actor]
 }
diff --git a/actor/src/main/scala/org/apache/pekko/japi/JavaAPI.scala b/actor/src/main/scala/org/apache/pekko/japi/JavaAPI.scala
index 6af233658d..cdd5831ecc 100644
--- a/actor/src/main/scala/org/apache/pekko/japi/JavaAPI.scala
+++ b/actor/src/main/scala/org/apache/pekko/japi/JavaAPI.scala
@@ -109,7 +109,7 @@ object Util {
    * Returns an immutable.Seq representing the provided array of Classes,
    * an overloading of the generic immutableSeq in Util, to accommodate for erasure.
    */
-  def immutableSeq(arr: Array[Class[_]]): immutable.Seq[Class[_]] = immutableSeq[Class[_]](arr)
+  def immutableSeq(arr: Array[Class[?]]): immutable.Seq[Class[?]] = immutableSeq[Class[?]](arr)
 
   /**
    * Turns an array into an immutable Scala sequence (by copying it).
@@ -122,7 +122,7 @@ object Util {
    */
   def immutableSeq[T](iterable: java.lang.Iterable[T]): immutable.Seq[T] =
     iterable match {
-      case imm: immutable.Seq[_] => imm.asInstanceOf[immutable.Seq[T]]
+      case imm: immutable.Seq[?] => imm.asInstanceOf[immutable.Seq[T]]
       case other                 =>
         val i = other.iterator()
         if (i.hasNext) {
diff --git a/actor/src/main/scala/org/apache/pekko/pattern/CircuitBreaker.scala b/actor/src/main/scala/org/apache/pekko/pattern/CircuitBreaker.scala
index 25c296f06f..7b9f81f0df 100644
--- a/actor/src/main/scala/org/apache/pekko/pattern/CircuitBreaker.scala
+++ b/actor/src/main/scala/org/apache/pekko/pattern/CircuitBreaker.scala
@@ -767,8 +767,8 @@ class CircuitBreaker(
       case _                       => allowExceptions.contains(ex.getClass.getName)
     })
 
-  private val failureFn: Try[_] => Boolean = {
-    case _: Success[_]                       => false
+  private val failureFn: Try[?] => Boolean = {
+    case _: Success[?]                       => false
     case Failure(t) if isIgnoredException(t) => false
     case _                                   => true
   }
@@ -828,7 +828,7 @@ class CircuitBreaker(
         val f = materialize(body)
 
         f.onComplete {
-          case _: Success[_] =>
+          case _: Success[?] =>
             notifyCallSuccessListeners(start)
             callSucceeds()
           case Failure(_) =>
diff --git a/actor/src/main/scala/org/apache/pekko/pattern/CircuitBreakersRegistry.scala b/actor/src/main/scala/org/apache/pekko/pattern/CircuitBreakersRegistry.scala
index c3694e0b0d..2298537643 100644
--- a/actor/src/main/scala/org/apache/pekko/pattern/CircuitBreakersRegistry.scala
+++ b/actor/src/main/scala/org/apache/pekko/pattern/CircuitBreakersRegistry.scala
@@ -44,7 +44,7 @@ object CircuitBreakersRegistry extends ExtensionId[CircuitBreakersRegistry] with
   /**
    * Returns the canonical ExtensionId for this Extension
    */
-  override def lookup: ExtensionId[_ <: Extension] = CircuitBreakersRegistry
+  override def lookup: ExtensionId[? <: Extension] = CircuitBreakersRegistry
 
   /**
    * Returns an instance of the extension identified by this ExtensionId instance.
diff --git a/actor/src/main/scala/org/apache/pekko/pattern/StatusReply.scala b/actor/src/main/scala/org/apache/pekko/pattern/StatusReply.scala
index 31e274914b..87a2aa8cff 100644
--- a/actor/src/main/scala/org/apache/pekko/pattern/StatusReply.scala
+++ b/actor/src/main/scala/org/apache/pekko/pattern/StatusReply.scala
@@ -57,7 +57,7 @@ final class StatusReply[+T] private (private val status: Try[T]) {
   def isSuccess: Boolean = status.isSuccess
 
   override def equals(other: Any): Boolean = other match {
-    case that: StatusReply[_] => status == that.status
+    case that: StatusReply[?] => status == that.status
     case _                    => false
   }
 
@@ -229,7 +229,7 @@ object StatusReply {
      * Also note that Pekko does not contain pre-built serializers for arbitrary exceptions.
      */
     def apply[T](exception: Throwable): StatusReply[T] = new StatusReply(ScalaFailure(exception))
-    def unapply(status: StatusReply[_]): Option[Throwable] =
+    def unapply(status: StatusReply[?]): Option[Throwable] =
       if ((status ne null) && status.isError) Some(status.getError)
       else None
   }
diff --git a/actor/src/main/scala/org/apache/pekko/serialization/PrimitiveSerializers.scala b/actor/src/main/scala/org/apache/pekko/serialization/PrimitiveSerializers.scala
index e256893779..224046002e 100644
--- a/actor/src/main/scala/org/apache/pekko/serialization/PrimitiveSerializers.scala
+++ b/actor/src/main/scala/org/apache/pekko/serialization/PrimitiveSerializers.scala
@@ -51,7 +51,7 @@ import pekko.util.ByteString
     result
   }
 
-  override def fromBinary(bytes: Array[Byte], manifest: Option[Class[_]]): AnyRef = {
+  override def fromBinary(bytes: Array[Byte], manifest: Option[Class[?]]): AnyRef = {
     var result = 0L
     var i = 7
     while (i >= 0) {
@@ -89,7 +89,7 @@ import pekko.util.ByteString
     result
   }
 
-  override def fromBinary(bytes: Array[Byte], manifest: Option[Class[_]]): AnyRef = {
+  override def fromBinary(bytes: Array[Byte], manifest: Option[Class[?]]): AnyRef = {
     var result = 0
     var i = 3
     while (i >= 0) {
@@ -121,7 +121,7 @@ import pekko.util.ByteString
 
   override def toBinary(o: AnyRef): Array[Byte] = o.asInstanceOf[String].getBytes(StandardCharsets.UTF_8)
 
-  override def fromBinary(bytes: Array[Byte], manifest: Option[Class[_]]): AnyRef =
+  override def fromBinary(bytes: Array[Byte], manifest: Option[Class[?]]): AnyRef =
     new String(bytes, StandardCharsets.UTF_8)
 
 }
@@ -154,7 +154,7 @@ import pekko.util.ByteString
     result
   }
 
-  override def fromBinary(bytes: Array[Byte], manifest: Option[Class[_]]): AnyRef = {
+  override def fromBinary(bytes: Array[Byte], manifest: Option[Class[?]]): AnyRef = {
     ByteString(bytes)
   }
 
@@ -204,7 +204,7 @@ import pekko.util.ByteString
     result
   }
 
-  override def fromBinary(bytes: Array[Byte], manifest: Option[Class[_]]): AnyRef = {
+  override def fromBinary(bytes: Array[Byte], manifest: Option[Class[?]]): AnyRef = {
     bytes(0) match {
       case TrueB  => TRUE
       case FalseB => FALSE
diff --git a/actor/src/main/scala/org/apache/pekko/serialization/Serialization.scala b/actor/src/main/scala/org/apache/pekko/serialization/Serialization.scala
index eb878635ec..6a0301af64 100644
--- a/actor/src/main/scala/org/apache/pekko/serialization/Serialization.scala
+++ b/actor/src/main/scala/org/apache/pekko/serialization/Serialization.scala
@@ -39,7 +39,7 @@ object Serialization {
   /**
    * Tuple that represents mapping from Class to Serializer
    */
-  type ClassSerializer = (Class[_], Serializer)
+  type ClassSerializer = (Class[?], Serializer)
 
   /**
    * INTERNAL API: This holds a reference to the current transport serialization information used for
@@ -152,7 +152,7 @@ class Serialization(val system: ExtendedActorSystem) extends Extension {
 
   private[this] val _log = Logging.withMarker(system, getClass.getName)
   val log: LoggingAdapter = _log
-  private val manifestCache = new AtomicReference[Map[String, Option[Class[_]]]](Map.empty[String, Option[Class[_]]])
+  private val manifestCache = new AtomicReference[Map[String, Option[Class[?]]]](Map.empty[String, Option[Class[?]]])
 
   /** INTERNAL API */
   @InternalApi private[pekko] def serializationInformation: Serialization.Information =
@@ -197,7 +197,7 @@ class Serialization(val system: ExtendedActorSystem) extends Extension {
 
   private def deserializeByteArray(bytes: Array[Byte], serializer: Serializer, manifest: String): AnyRef = {
 
-    @tailrec def updateCache(cache: Map[String, Option[Class[_]]], key: String, value: Option[Class[_]]): Boolean = {
+    @tailrec def updateCache(cache: Map[String, Option[Class[?]]], key: String, value: Option[Class[?]]): Boolean = {
       manifestCache.compareAndSet(cache, cache.updated(key, value)) ||
       updateCache(manifestCache.get, key, value) // recursive, try again
     }
@@ -215,7 +215,7 @@ class Serialization(val system: ExtendedActorSystem) extends Extension {
               case None                      =>
                 system.dynamicAccess.getClassFor[AnyRef](manifest) match {
                   case Success(classManifest) =>
-                    val classManifestOption: Option[Class[_]] = Some(classManifest)
+                    val classManifestOption: Option[Class[?]] = Some(classManifest)
                     updateCache(cache, manifest, classManifestOption)
                     s1.fromBinary(bytes, classManifestOption)
                   case Failure(_) =>
@@ -291,10 +291,10 @@ class Serialization(val system: ExtendedActorSystem) extends Extension {
    * Throws java.io.NotSerializableException if no `serialization-bindings` is configured for the class.
    */
   @throws(classOf[NotSerializableException])
-  def serializerFor(clazz: Class[_]): Serializer =
+  def serializerFor(clazz: Class[?]): Serializer =
     serializerMap.get(clazz) match {
       case null => // bindings are ordered from most specific to least specific
-        def unique(possibilities: immutable.Seq[(Class[_], Serializer)]): Boolean =
+        def unique(possibilities: immutable.Seq[(Class[?], Serializer)]): Boolean =
           possibilities.size == 1 || {
             val possibility = possibilities.head
             possibilities.forall(_._1.isAssignableFrom(possibility._1)) ||
@@ -380,14 +380,14 @@ class Serialization(val system: ExtendedActorSystem) extends Extension {
       } else serializerFQN
 
     // Try constructors in order of preference (most specific first)
-    val singleArgConstructors: List[List[(Class[_], AnyRef)]] =
+    val singleArgConstructors: List[List[(Class[?], AnyRef)]] =
       List(
         List(classOf[ExtendedActorSystem] -> system),
         List(classOf[ActorSystem] -> system),
         List(classOf[ClassicActorSystemProvider] -> (system: ClassicActorSystemProvider)),
         Nil)
 
-    val twoArgConstructors: List[List[(Class[_], AnyRef)]] =
+    val twoArgConstructors: List[List[(Class[?], AnyRef)]] =
       if (bindingName == "") Nil
       else
         List(
@@ -398,7 +398,7 @@ class Serialization(val system: ExtendedActorSystem) extends Extension {
 
     val allConstructors = singleArgConstructors ++ twoArgConstructors
 
-    def tryNext(remaining: List[List[(Class[_], AnyRef)]]): Try[Serializer] =
+    def tryNext(remaining: List[List[(Class[?], AnyRef)]]): Try[Serializer] =
       remaining match {
         case Nil =>
           Failure(
@@ -469,7 +469,7 @@ class Serialization(val system: ExtendedActorSystem) extends Extension {
     }
   }
 
-  private def warnUnexpectedNonPekkoSerializer(clazz: Class[_], ser: Serializer): Boolean = {
+  private def warnUnexpectedNonPekkoSerializer(clazz: Class[?], ser: Serializer): Boolean = {
     val clazzName = clazz.getName
     if (clazzName.startsWith(PekkoPackagePrefix) && !ser.getClass.getName.startsWith(PekkoPackagePrefix)) {
       log.warning(
@@ -510,8 +510,8 @@ class Serialization(val system: ExtendedActorSystem) extends Extension {
    * serializerMap is a Map whose keys is the class that is serializable and values is the serializer
    * to be used for that class.
    */
-  private val serializerMap: ConcurrentHashMap[Class[_], Serializer] =
-    bindings.foldLeft(new ConcurrentHashMap[Class[_], Serializer]) { case (map, (c, s)) => map.put(c, s); map }
+  private val serializerMap: ConcurrentHashMap[Class[?], Serializer] =
+    bindings.foldLeft(new ConcurrentHashMap[Class[?], Serializer]) { case (map, (c, s)) => map.put(c, s); map }
 
   /**
    * Maps from a Serializer Identity (Int) to a Serializer instance (optimization)
@@ -569,9 +569,9 @@ class Serialization(val system: ExtendedActorSystem) extends Extension {
   /**
    * INTERNAL API
    */
-  @InternalApi private[pekko] def shouldWarnAboutJavaSerializer(serializedClass: Class[_], serializer: Serializer) = {
+  @InternalApi private[pekko] def shouldWarnAboutJavaSerializer(serializedClass: Class[?], serializer: Serializer) = {
 
-    def suppressWarningOnNonSerializationVerification(serializedClass: Class[_]) = {
+    def suppressWarningOnNonSerializationVerification(serializedClass: Class[?]) = {
       // suppressed, only when warn-on-no-serialization-verification = off, and extending NoSerializationVerificationNeeded
       !isWarningOnNoVerificationEnabled && classOf[NoSerializationVerificationNeeded].isAssignableFrom(serializedClass)
     }
diff --git a/actor/src/main/scala/org/apache/pekko/serialization/SerializationSetup.scala b/actor/src/main/scala/org/apache/pekko/serialization/SerializationSetup.scala
index a6f942a8a3..0e32bd811f 100644
--- a/actor/src/main/scala/org/apache/pekko/serialization/SerializationSetup.scala
+++ b/actor/src/main/scala/org/apache/pekko/serialization/SerializationSetup.scala
@@ -55,7 +55,7 @@ object SerializerDetails {
    * @param useFor A set of classes or superclasses to bind to the serializer, selection works just as if
    *               the classes, the alias and the serializer had been in the config.
    */
-  def apply(alias: String, serializer: Serializer, useFor: immutable.Seq[Class[_]]): SerializerDetails =
+  def apply(alias: String, serializer: Serializer, useFor: immutable.Seq[Class[?]]): SerializerDetails =
     new SerializerDetails(alias, serializer, useFor)
 
   /**
@@ -65,7 +65,7 @@ object SerializerDetails {
    * @param useFor A set of classes or superclasses to bind to the serializer, selection works just as if
    *               the classes, the alias and the serializer had been in the config.
    */
-  def create(alias: String, serializer: Serializer, useFor: java.util.List[Class[_]]): SerializerDetails =
+  def create(alias: String, serializer: Serializer, useFor: java.util.List[Class[?]]): SerializerDetails =
     apply(alias, serializer, useFor.asScala.toVector)
 
 }
@@ -77,4 +77,4 @@ object SerializerDetails {
 final class SerializerDetails private (
     val alias: String,
     val serializer: Serializer,
-    val useFor: immutable.Seq[Class[_]])
+    val useFor: immutable.Seq[Class[?]])
diff --git a/actor/src/main/scala/org/apache/pekko/serialization/Serializer.scala b/actor/src/main/scala/org/apache/pekko/serialization/Serializer.scala
index b553d0db2f..01cc91c381 100644
--- a/actor/src/main/scala/org/apache/pekko/serialization/Serializer.scala
+++ b/actor/src/main/scala/org/apache/pekko/serialization/Serializer.scala
@@ -78,7 +78,7 @@ trait Serializer {
    * the class should be loaded using ActorSystem.dynamicAccess.
    */
   @throws(classOf[NotSerializableException])
-  def fromBinary(bytes: Array[Byte], manifest: Option[Class[_]]): AnyRef
+  def fromBinary(bytes: Array[Byte], manifest: Option[Class[?]]): AnyRef
 
   /**
    * Java API: deserialize without type hint
@@ -89,7 +89,7 @@ trait Serializer {
    * Java API: deserialize with type hint
    */
   @throws(classOf[NotSerializableException])
-  final def fromBinary(bytes: Array[Byte], clazz: Class[_]): AnyRef = fromBinary(bytes, Option(clazz))
+  final def fromBinary(bytes: Array[Byte], clazz: Class[?]): AnyRef = fromBinary(bytes, Option(clazz))
 }
 
 object Serializers {
@@ -175,7 +175,7 @@ abstract class SerializerWithStringManifest extends Serializer {
   @throws(classOf[NotSerializableException])
   def fromBinary(bytes: Array[Byte], manifest: String): AnyRef
 
-  final def fromBinary(bytes: Array[Byte], manifest: Option[Class[_]]): AnyRef = {
+  final def fromBinary(bytes: Array[Byte], manifest: Option[Class[?]]): AnyRef = {
     val manifestString = manifest match {
       case Some(c) => c.getName
       case None    => ""
@@ -286,7 +286,7 @@ object BaseSerializer {
 
   /** INTERNAL API */
   @InternalApi
-  private[pekko] def identifierFromConfig(clazz: Class[_], system: ExtendedActorSystem): Int =
+  private[pekko] def identifierFromConfig(clazz: Class[?], system: ExtendedActorSystem): Int =
     system.settings.config.getInt(s"""$SerializationIdentifiers."${clazz.getName}"""")
 
   /** INTERNAL API */
@@ -304,13 +304,13 @@ object BaseSerializer {
 abstract class JSerializer extends Serializer {
 
   @throws(classOf[NotSerializableException])
-  final def fromBinary(bytes: Array[Byte], manifest: Option[Class[_]]): AnyRef =
+  final def fromBinary(bytes: Array[Byte], manifest: Option[Class[?]]): AnyRef =
     fromBinaryJava(bytes, manifest.orNull)
 
   /**
    * This method must be implemented, manifest may be null.
    */
-  protected def fromBinaryJava(bytes: Array[Byte], manifest: Class[_]): AnyRef
+  protected def fromBinaryJava(bytes: Array[Byte], manifest: Class[?]): AnyRef
 }
 
 object NullSerializer extends NullSerializer
@@ -365,7 +365,7 @@ class JavaSerializer(val system: ExtendedActorSystem) extends BaseSerializer {
   }
 
   @throws(classOf[NotSerializableException])
-  def fromBinary(bytes: Array[Byte], clazz: Option[Class[_]]): AnyRef = {
+  def fromBinary(bytes: Array[Byte], clazz: Option[Class[?]]): AnyRef = {
     val in =
       new ClassLoaderObjectInputStream(system.dynamicAccess.classLoader, new UnsynchronizedByteArrayInputStream(bytes))
     try JavaSerializer.currentSystem.withValue(system) { in.readObject }
@@ -398,7 +398,7 @@ final case class DisabledJavaSerializer(system: ExtendedActorSystem) extends Ser
   }
 
   @throws(classOf[NotSerializableException])
-  override def fromBinary(bytes: Array[Byte], clazz: Option[Class[_]]): AnyRef = {
+  override def fromBinary(bytes: Array[Byte], clazz: Option[Class[?]]): AnyRef = {
     log.warning(
       LogMarker.Security,
       "Incoming message attempted to use Java Serialization even though `pekko.actor.allow-java-serialization = off` was set!")
@@ -438,7 +438,7 @@ class NullSerializer extends Serializer {
   def identifier = 0
   def toBinary(o: AnyRef): Array[Byte] = nullAsBytes
   @throws(classOf[NotSerializableException])
-  def fromBinary(bytes: Array[Byte], clazz: Option[Class[_]]): AnyRef = null
+  def fromBinary(bytes: Array[Byte], clazz: Option[Class[?]]): AnyRef = null
 }
 
 /**
@@ -457,7 +457,7 @@ class ByteArraySerializer(val system: ExtendedActorSystem) extends BaseSerialize
   }
 
   @throws(classOf[NotSerializableException])
-  def fromBinary(bytes: Array[Byte], clazz: Option[Class[_]]): AnyRef = bytes
+  def fromBinary(bytes: Array[Byte], clazz: Option[Class[?]]): AnyRef = bytes
 
   override def toBinary(o: AnyRef, buf: ByteBuffer): Unit =
     o match {
diff --git a/actor/src/main/scala/org/apache/pekko/util/BoundedBlockingQueue.scala b/actor/src/main/scala/org/apache/pekko/util/BoundedBlockingQueue.scala
index e6ffeae3fb..a51e2cbb62 100644
--- a/actor/src/main/scala/org/apache/pekko/util/BoundedBlockingQueue.scala
+++ b/actor/src/main/scala/org/apache/pekko/util/BoundedBlockingQueue.scala
@@ -30,11 +30,11 @@ class BoundedBlockingQueue[E <: AnyRef](val maxCapacity: Int, private val backin
 
   backing match {
     case null                => throw new IllegalArgumentException("Backing Queue may not be null")
-    case b: BlockingQueue[_] =>
+    case b: BlockingQueue[?] =>
       require(maxCapacity > 0)
       require(b.size() == 0)
       require(b.remainingCapacity >= maxCapacity)
-    case b: Queue[_] =>
+    case b: Queue[?] =>
       require(b.size() == 0)
       require(maxCapacity > 0)
   }
@@ -186,9 +186,9 @@ class BoundedBlockingQueue[E <: AnyRef](val maxCapacity: Int, private val backin
     finally lock.unlock()
   }
 
-  def drainTo(c: Collection[_ >: E]): Int = drainTo(c, Int.MaxValue)
+  def drainTo(c: Collection[? >: E]): Int = drainTo(c, Int.MaxValue)
 
-  def drainTo(c: Collection[_ >: E], maxElements: Int): Int = {
+  def drainTo(c: Collection[? >: E], maxElements: Int): Int = {
     if (c eq null) throw new NullPointerException
     if (c eq this) throw new IllegalArgumentException
     if (c eq backing) throw new IllegalArgumentException
@@ -211,13 +211,13 @@ class BoundedBlockingQueue[E <: AnyRef](val maxCapacity: Int, private val backin
     }
   }
 
-  override def containsAll(c: Collection[_]): Boolean = {
+  override def containsAll(c: Collection[?]): Boolean = {
     lock.lock()
     try backing.containsAll(c)
     finally lock.unlock()
   }
 
-  override def removeAll(c: Collection[_]): Boolean = {
+  override def removeAll(c: Collection[?]): Boolean = {
     lock.lock()
     try {
       if (backing.removeAll(c)) {
@@ -229,7 +229,7 @@ class BoundedBlockingQueue[E <: AnyRef](val maxCapacity: Int, private val backin
     } finally lock.unlock()
   }
 
-  override def retainAll(c: Collection[_]): Boolean = {
+  override def retainAll(c: Collection[?]): Boolean = {
     lock.lock()
     try {
       if (backing.retainAll(c)) {
diff --git a/actor/src/main/scala/org/apache/pekko/util/BoxedType.scala b/actor/src/main/scala/org/apache/pekko/util/BoxedType.scala
index e26094214d..0e7fc09754 100644
--- a/actor/src/main/scala/org/apache/pekko/util/BoxedType.scala
+++ b/actor/src/main/scala/org/apache/pekko/util/BoxedType.scala
@@ -16,7 +16,7 @@ package org.apache.pekko.util
 object BoxedType {
   import java.{ lang => jl }
 
-  private val toBoxed = Map[Class[_], Class[_]](
+  private val toBoxed = Map[Class[?], Class[?]](
     classOf[Boolean] -> classOf[jl.Boolean],
     classOf[Byte] -> classOf[jl.Byte],
     classOf[Char] -> classOf[jl.Character],
@@ -27,5 +27,5 @@ object BoxedType {
     classOf[Double] -> classOf[jl.Double],
     classOf[Unit] -> classOf[scala.runtime.BoxedUnit])
 
-  final def apply(c: Class[_]): Class[_] = if (c.isPrimitive) toBoxed(c) else c
+  final def apply(c: Class[?]): Class[?] = if (c.isPrimitive) toBoxed(c) else c
 }
diff --git a/actor/src/main/scala/org/apache/pekko/util/ClassLoaderObjectInputStream.scala b/actor/src/main/scala/org/apache/pekko/util/ClassLoaderObjectInputStream.scala
index ed35147fa3..b5a6f66a8d 100644
--- a/actor/src/main/scala/org/apache/pekko/util/ClassLoaderObjectInputStream.scala
+++ b/actor/src/main/scala/org/apache/pekko/util/ClassLoaderObjectInputStream.scala
@@ -23,7 +23,7 @@ import java.io.{ InputStream, ObjectInputStream, ObjectStreamClass }
  * @param is - the InputStream that is wrapped
  */
 class ClassLoaderObjectInputStream(classLoader: ClassLoader, is: InputStream) extends ObjectInputStream(is) {
-  override protected def resolveClass(objectStreamClass: ObjectStreamClass): Class[_] =
+  override protected def resolveClass(objectStreamClass: ObjectStreamClass): Class[?] =
     try Class.forName(objectStreamClass.getName, false, classLoader)
     catch {
       case _: ClassNotFoundException => super.resolveClass(objectStreamClass)
diff --git a/actor/src/main/scala/org/apache/pekko/util/LineNumbers.scala b/actor/src/main/scala/org/apache/pekko/util/LineNumbers.scala
index 5d22f9d79f..53b7668873 100644
--- a/actor/src/main/scala/org/apache/pekko/util/LineNumbers.scala
+++ b/actor/src/main/scala/org/apache/pekko/util/LineNumbers.scala
@@ -196,7 +196,7 @@ object LineNumbers {
     }
   }
 
-  private def getStreamForClass(c: Class[_]): Option[(InputStream, None.type)] = {
+  private def getStreamForClass(c: Class[?]): Option[(InputStream, None.type)] = {
     val resource = c.getName.replace('.', '/') + ".class"
     val cl = c.getClassLoader
     val r = cl.getResourceAsStream(resource)
diff --git a/actor/src/main/scala/org/apache/pekko/util/Reflect.scala b/actor/src/main/scala/org/apache/pekko/util/Reflect.scala
index 8b89481ce8..14d7850590 100644
--- a/actor/src/main/scala/org/apache/pekko/util/Reflect.scala
+++ b/actor/src/main/scala/org/apache/pekko/util/Reflect.scala
@@ -40,11 +40,11 @@ private[pekko] object Reflect {
    *
    * Hint: when comparing to Thread.currentThread().getStackTrace, add two levels.
    */
-  val getCallerClass: Option[Int => Class[_]] = {
+  val getCallerClass: Option[Int => Class[?]] = {
     try {
       val c = Class.forName("sun.reflect.Reflection")
       val m = c.getMethod("getCallerClass", Array(classOf[Int]): _*)
-      Some((i: Int) => m.invoke(null, Array[AnyRef](i.asInstanceOf[java.lang.Integer]): _*).asInstanceOf[Class[_]])
+      Some((i: Int) => m.invoke(null, Array[AnyRef](i.asInstanceOf[java.lang.Integer]): _*).asInstanceOf[Class[?]])
     } catch {
       case NonFatal(_) => None
     }
@@ -123,7 +123,7 @@ private[pekko] object Reflect {
     else constructor
   }
 
-  private def safeGetClass(a: Any): Class[_] =
+  private def safeGetClass(a: Any): Class[?] =
     if (a == null) classOf[AnyRef] else a.getClass
 
   /**
@@ -133,17 +133,17 @@ private[pekko] object Reflect {
    */
   private[pekko] def instantiator[T](clazz: Class[T]): () => T = () => instantiate(clazz)
 
-  def findMarker(root: Class[_], marker: Class[_]): Type = {
-    @tailrec def rec(curr: Class[_]): Type = {
+  def findMarker(root: Class[?], marker: Class[?]): Type = {
+    @tailrec def rec(curr: Class[?]): Type = {
       if ((curr.getSuperclass ne null) && marker.isAssignableFrom(curr.getSuperclass)) rec(curr.getSuperclass)
       else
         curr.getGenericInterfaces.collectFirst {
-          case c: Class[_] if marker.isAssignableFrom(c)                                            => c
-          case t: ParameterizedType if marker.isAssignableFrom(t.getRawType.asInstanceOf[Class[_]]) => t
+          case c: Class[?] if marker.isAssignableFrom(c)                                            => c
+          case t: ParameterizedType if marker.isAssignableFrom(t.getRawType.asInstanceOf[Class[?]]) => t
         } match {
           case None                       => throw new IllegalArgumentException(s"cannot find [$marker] in ancestors of [$root]")
-          case Some(c: Class[_])          => if (c == marker) c else rec(c)
-          case Some(t: ParameterizedType) => if (t.getRawType == marker) t else rec(t.getRawType.asInstanceOf[Class[_]])
+          case Some(c: Class[?])          => if (c == marker) c else rec(c)
+          case Some(t: ParameterizedType) => if (t.getRawType == marker) t else rec(t.getRawType.asInstanceOf[Class[?]])
           case _                          => ??? // cannot happen due to collectFirst
         }
     }
@@ -154,7 +154,7 @@ private[pekko] object Reflect {
    * INTERNAL API
    */
   private[pekko] def findClassLoader(): ClassLoader = {
-    def findCaller(get: Int => Class[_]): ClassLoader =
+    def findCaller(get: Int => Class[?]): ClassLoader =
       Iterator
         .from(2 /*is the magic number, promise*/ )
         .map(get)
diff --git a/actor/src/main/scala/org/apache/pekko/util/TypedMultiMap.scala b/actor/src/main/scala/org/apache/pekko/util/TypedMultiMap.scala
index 1677426028..cdec7a46c3 100644
--- a/actor/src/main/scala/org/apache/pekko/util/TypedMultiMap.scala
+++ b/actor/src/main/scala/org/apache/pekko/util/TypedMultiMap.scala
@@ -109,7 +109,7 @@ class TypedMultiMap[T <: AnyRef, K[_ <: T]] private (private val map: Map[T, Set
 
   override def toString: String = s"TypedMultiMap($map)"
   override def equals(other: Any) = other match {
-    case o: TypedMultiMap[_, _] => map == o.map
+    case o: TypedMultiMap[?, ?] => map == o.map
     case _                      => false
   }
   override def hashCode: Int = map.hashCode
diff --git a/bench-jmh/src/main/scala/org/apache/pekko/actor/typed/TypedBenchmarkActors.scala b/bench-jmh/src/main/scala/org/apache/pekko/actor/typed/TypedBenchmarkActors.scala
index 0976e64c5a..dea2a1b1e2 100644
--- a/bench-jmh/src/main/scala/org/apache/pekko/actor/typed/TypedBenchmarkActors.scala
+++ b/bench-jmh/src/main/scala/org/apache/pekko/actor/typed/TypedBenchmarkActors.scala
@@ -161,7 +161,7 @@ object TypedBenchmarkActors {
   }
 
   private def startPingPongActorPairs(
-      ctx: ActorContext[_],
+      ctx: ActorContext[?],
       messagesPerPair: Int,
       numPairs: Int,
       dispatcher: String): (Vector[(ActorRef[Message], ActorRef[Message])], CountDownLatch) = {
diff --git a/bench-jmh/src/main/scala/org/apache/pekko/remote/artery/CodecBenchmark.scala b/bench-jmh/src/main/scala/org/apache/pekko/remote/artery/CodecBenchmark.scala
index d60f1dafc1..3f019fd3b0 100644
--- a/bench-jmh/src/main/scala/org/apache/pekko/remote/artery/CodecBenchmark.scala
+++ b/bench-jmh/src/main/scala/org/apache/pekko/remote/artery/CodecBenchmark.scala
@@ -295,7 +295,7 @@ object CodecBenchmark {
 
     override def toBinary(o: AnyRef): Array[Byte] = Preserialized
 
-    override def fromBinary(bytes: Array[Byte], manifest: Option[Class[_]]): AnyRef =
+    override def fromBinary(bytes: Array[Byte], manifest: Option[Class[?]]): AnyRef =
       fromBinary(ByteBuffer.wrap(bytes), "NoManifestForYou")
   }
 
diff --git a/bench-jmh/src/main/scala/org/apache/pekko/stream/ActorGraphInterpreterBoundaryBenchmark.scala b/bench-jmh/src/main/scala/org/apache/pekko/stream/ActorGraphInterpreterBoundaryBenchmark.scala
index d737283cc4..92b07b53cc 100644
--- a/bench-jmh/src/main/scala/org/apache/pekko/stream/ActorGraphInterpreterBoundaryBenchmark.scala
+++ b/bench-jmh/src/main/scala/org/apache/pekko/stream/ActorGraphInterpreterBoundaryBenchmark.scala
@@ -47,7 +47,7 @@ object ActorGraphInterpreterBoundaryBenchmark {
   final val CancelAfter = ElementCount / 2
 
   final class SynchronousPublisher(elements: Array[MutableElement]) extends Publisher[MutableElement] {
-    override def subscribe(subscriber: Subscriber[_ >: MutableElement]): Unit = {
+    override def subscribe(subscriber: Subscriber[? >: MutableElement]): Unit = {
       if (subscriber eq null) throw new NullPointerException("subscriber")
 
       subscriber.onSubscribe(new Subscription {
diff --git a/bench-jmh/src/main/scala/org/apache/pekko/stream/FlowMapBenchmark.scala b/bench-jmh/src/main/scala/org/apache/pekko/stream/FlowMapBenchmark.scala
index f689aa2095..b7a6085802 100644
--- a/bench-jmh/src/main/scala/org/apache/pekko/stream/FlowMapBenchmark.scala
+++ b/bench-jmh/src/main/scala/org/apache/pekko/stream/FlowMapBenchmark.scala
@@ -111,7 +111,7 @@ class FlowMapBenchmark {
   }
 
   // source setup
-  private def mkMaps[O, Mat](source: Source[O, Mat], count: Int)(flow: => Graph[FlowShape[O, O], _]): Source[O, Mat] = {
+  private def mkMaps[O, Mat](source: Source[O, Mat], count: Int)(flow: => Graph[FlowShape[O, O], ?]): Source[O, Mat] = {
     var f = source
     for (_ <- 1 to count)
       f = f.via(flow)
diff --git a/cluster-metrics/src/main/scala/org/apache/pekko/cluster/metrics/protobuf/NumberInputStream.scala b/cluster-metrics/src/main/scala/org/apache/pekko/cluster/metrics/protobuf/NumberInputStream.scala
index 9ce5438c38..6a5d073c3f 100644
--- a/cluster-metrics/src/main/scala/org/apache/pekko/cluster/metrics/protobuf/NumberInputStream.scala
+++ b/cluster-metrics/src/main/scala/org/apache/pekko/cluster/metrics/protobuf/NumberInputStream.scala
@@ -45,7 +45,7 @@ private[protobuf] class NumberInputStream(
    * @return the Class object described by the ObjectStreamClass
    * @throws ClassNotFoundException if the Class cannot be found (or is rejected)
    */
-  override protected def resolveClass(objectStreamClass: ObjectStreamClass): Class[_] = {
+  override protected def resolveClass(objectStreamClass: ObjectStreamClass): Class[?] = {
     val clazz = super.resolveClass(objectStreamClass)
     if (clazz.isPrimitive() || (clazz.isArray() && clazz.getComponentType.isPrimitive) ||
       classOf[Number].isAssignableFrom(clazz) || clazz.getPackage.getName == "java.math") {
diff --git a/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/ClusterShardingQuery.scala b/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/ClusterShardingQuery.scala
index 4349ddf328..308c9566fb 100644
--- a/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/ClusterShardingQuery.scala
+++ b/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/ClusterShardingQuery.scala
@@ -36,7 +36,7 @@ sealed trait ClusterShardingQuery
  *
  * For the statistics for the entire cluster, see [[GetClusterShardingStats]].
  */
-final case class GetShardRegionState(entityTypeKey: EntityTypeKey[_], replyTo: ActorRef[CurrentShardRegionState])
+final case class GetShardRegionState(entityTypeKey: EntityTypeKey[?], replyTo: ActorRef[CurrentShardRegionState])
     extends ClusterShardingQuery {
 
   /**
@@ -45,7 +45,7 @@ final case class GetShardRegionState(entityTypeKey: EntityTypeKey[_], replyTo: A
    * Query the ShardRegion state for the given entity type key. This will get the state of the
    * local ShardRegion's state.
    */
-  def this(entityTypeKey: javadsl.EntityTypeKey[_], replyTo: ActorRef[CurrentShardRegionState]) =
+  def this(entityTypeKey: javadsl.EntityTypeKey[?], replyTo: ActorRef[CurrentShardRegionState]) =
     this(entityTypeKey.asScala, replyTo)
 }
 
@@ -61,7 +61,7 @@ final case class GetShardRegionState(entityTypeKey: EntityTypeKey[_], replyTo: A
  * @param replyTo the actor to send the result to
  */
 final case class GetClusterShardingStats(
-    entityTypeKey: EntityTypeKey[_],
+    entityTypeKey: EntityTypeKey[?],
     timeout: FiniteDuration,
     replyTo: ActorRef[ClusterShardingStats])
     extends ClusterShardingQuery {
@@ -74,7 +74,7 @@ final case class GetClusterShardingStats(
    * shard regions the reply will contain an empty map of regions.
    */
   def this(
-      entityTypeKey: javadsl.EntityTypeKey[_],
+      entityTypeKey: javadsl.EntityTypeKey[?],
       timeout: java.time.Duration,
       replyTo: ActorRef[ClusterShardingStats]) =
     this(entityTypeKey.asScala, timeout.toScala, replyTo)
diff --git a/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/ClusterShardingSettings.scala b/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/ClusterShardingSettings.scala
index 5bf6ee1ac3..f4a5cf6c98 100644
--- a/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/ClusterShardingSettings.scala
+++ b/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/ClusterShardingSettings.scala
@@ -33,7 +33,7 @@ import com.typesafe.config.Config
 object ClusterShardingSettings {
 
   /** Scala API: Creates new cluster sharding settings object */
-  def apply(system: ActorSystem[_]): ClusterShardingSettings =
+  def apply(system: ActorSystem[?]): ClusterShardingSettings =
     fromConfig(system.settings.config.getConfig("pekko.cluster.sharding"))
 
   def fromConfig(config: Config): ClusterShardingSettings = {
@@ -43,7 +43,7 @@ object ClusterShardingSettings {
   }
 
   /** Java API: Creates new cluster sharding settings object */
-  def create(system: ActorSystem[_]): ClusterShardingSettings =
+  def create(system: ActorSystem[?]): ClusterShardingSettings =
     apply(system)
 
   /** INTERNAL API: Intended only for internal use, it is not recommended to keep converting between the setting types */
diff --git a/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/ReplicatedShardingExtension.scala b/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/ReplicatedShardingExtension.scala
index 7340770f78..b470adba79 100644
--- a/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/ReplicatedShardingExtension.scala
+++ b/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/ReplicatedShardingExtension.scala
@@ -30,10 +30,10 @@ import pekko.persistence.typed.ReplicaId
  */
 object ReplicatedShardingExtension extends ExtensionId[ReplicatedShardingExtension] {
 
-  override def createExtension(system: ActorSystem[_]): ReplicatedShardingExtension =
+  override def createExtension(system: ActorSystem[?]): ReplicatedShardingExtension =
     new ReplicatedShardingExtensionImpl(system)
 
-  def get(system: ActorSystem[_]): ReplicatedShardingExtension = apply(system)
+  def get(system: ActorSystem[?]): ReplicatedShardingExtension = apply(system)
 
 }
 
diff --git a/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/ShardedDaemonProcessSettings.scala b/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/ShardedDaemonProcessSettings.scala
index 7364fd74ea..3224d1674e 100644
--- a/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/ShardedDaemonProcessSettings.scala
+++ b/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/ShardedDaemonProcessSettings.scala
@@ -29,12 +29,12 @@ import com.typesafe.config.Config
 object ShardedDaemonProcessSettings {
 
   /** Scala API: Create default settings for system */
-  def apply(system: ActorSystem[_]): ShardedDaemonProcessSettings = {
+  def apply(system: ActorSystem[?]): ShardedDaemonProcessSettings = {
     fromConfig(system.settings.config.getConfig("pekko.cluster.sharded-daemon-process"))
   }
 
   /** Java API: Create default settings for system */
-  def create(system: ActorSystem[_]): ShardedDaemonProcessSettings =
+  def create(system: ActorSystem[?]): ShardedDaemonProcessSettings =
     apply(system)
 
   /**
diff --git a/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/delivery/ShardingConsumerController.scala b/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/delivery/ShardingConsumerController.scala
index ab29606f75..6ef3a74be9 100644
--- a/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/delivery/ShardingConsumerController.scala
+++ b/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/delivery/ShardingConsumerController.scala
@@ -55,7 +55,7 @@ object ShardingConsumerController {
      * Scala API: Factory method from config `pekko.reliable-delivery.sharding.consumer-controller`
      * of the `ActorSystem`.
      */
-    def apply(system: ActorSystem[_]): Settings =
+    def apply(system: ActorSystem[?]): Settings =
       apply(system.settings.config.getConfig("pekko.reliable-delivery.sharding.consumer-controller"))
 
     /**
@@ -70,7 +70,7 @@ object ShardingConsumerController {
      * Java API: Factory method from config `pekko.reliable-delivery.sharding.consumer-controller`
      * of the `ActorSystem`.
      */
-    def create(system: ActorSystem[_]): Settings =
+    def create(system: ActorSystem[?]): Settings =
       apply(system)
 
     /**
diff --git a/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/delivery/ShardingProducerController.scala b/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/delivery/ShardingProducerController.scala
index 2a4e1d5884..342ecf2b29 100644
--- a/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/delivery/ShardingProducerController.scala
+++ b/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/delivery/ShardingProducerController.scala
@@ -175,7 +175,7 @@ object ShardingProducerController {
      * Scala API: Factory method from config `pekko.reliable-delivery.sharding.producer-controller`
      * of the `ActorSystem`.
      */
-    def apply(system: ActorSystem[_]): Settings =
+    def apply(system: ActorSystem[?]): Settings =
       apply(system.settings.config.getConfig("pekko.reliable-delivery.sharding.producer-controller"))
 
     /**
@@ -195,7 +195,7 @@ object ShardingProducerController {
      * Java API: Factory method from config `pekko.reliable-delivery.sharding.producer-controller`
      * of the `ActorSystem`.
      */
-    def create(system: ActorSystem[_]): Settings =
+    def create(system: ActorSystem[?]): Settings =
       apply(system)
 
     /**
diff --git a/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/delivery/internal/ShardingConsumerControllerImpl.scala b/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/delivery/internal/ShardingConsumerControllerImpl.scala
index adf156f918..3e85591e2a 100644
--- a/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/delivery/internal/ShardingConsumerControllerImpl.scala
+++ b/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/delivery/internal/ShardingConsumerControllerImpl.scala
@@ -46,7 +46,7 @@ import pekko.cluster.sharding.typed.delivery.ShardingConsumerController
   private def waitForStart[A](
       context: ActorContext[ConsumerController.Command[A]],
       settings: ShardingConsumerController.Settings,
-      consumer: ActorRef[_]): Behavior[ConsumerController.Command[A]] = {
+      consumer: ActorRef[?]): Behavior[ConsumerController.Command[A]] = {
     Behaviors.withStash(settings.bufferSize) { stashBuffer =>
       Behaviors
         .receiveMessage[ConsumerController.Command[A]] {
diff --git a/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/internal/ClusterShardingImpl.scala b/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/internal/ClusterShardingImpl.scala
index 97f08acba0..98406919d6 100644
--- a/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/internal/ClusterShardingImpl.scala
+++ b/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/internal/ClusterShardingImpl.scala
@@ -100,14 +100,14 @@ import pekko.util.{ ByteString, Timeout }
 }
 
 /** INTERNAL API */
-@InternalApi private[pekko] final class ClusterShardingImpl(system: ActorSystem[_])
+@InternalApi private[pekko] final class ClusterShardingImpl(system: ActorSystem[?])
     extends javadsl.ClusterSharding
     with scaladsl.ClusterSharding {
 
   import pekko.actor.typed.scaladsl.adapter._
 
   require(
-    system.isInstanceOf[ActorSystemAdapter[_]],
+    system.isInstanceOf[ActorSystemAdapter[?]],
     "only adapted classic actor systems can be used for cluster features")
 
   private val cluster = Cluster(system)
@@ -327,7 +327,7 @@ import pekko.util.{ ByteString, Timeout }
 
   override def equals(other: Any): Boolean =
     other match {
-      case eri: EntityRefImpl[_] =>
+      case eri: EntityRefImpl[?] =>
         (eri.entityId == entityId) &&
         (eri.typeKey == typeKey) &&
         (eri.dataCenter == dataCenter)
@@ -406,13 +406,13 @@ import pekko.util.{ ByteString, Timeout }
   // impl InternalRecipientRef
   override def provider: ActorRefProvider = {
     import pekko.actor.typed.scaladsl.adapter._
-    shardRegion.toTyped.asInstanceOf[InternalRecipientRef[_]].provider
+    shardRegion.toTyped.asInstanceOf[InternalRecipientRef[?]].provider
   }
 
   // impl InternalRecipientRef
   def isTerminated: Boolean = {
     import pekko.actor.typed.scaladsl.adapter._
-    shardRegion.toTyped.asInstanceOf[InternalRecipientRef[_]].isTerminated
+    shardRegion.toTyped.asInstanceOf[InternalRecipientRef[?]].isTerminated
   }
 
   override def toString: String = s"EntityRef($typeKey, $entityId)"
@@ -435,7 +435,7 @@ import pekko.util.{ ByteString, Timeout }
   import pekko.cluster.sharding.ShardRegion.{ Passivate => ClassicPassivate }
 
   def behavior(stopMessage: Any): Behavior[scaladsl.ClusterSharding.ShardCommand] = {
-    def sendClassicPassivate(entity: ActorRef[_], classicSystem: actor.ActorSystem): Unit = {
+    def sendClassicPassivate(entity: ActorRef[?], classicSystem: actor.ActorSystem): Unit = {
       val classicRef = entity.toClassic
       val pathToShard = classicRef.path.elements.take(4).mkString("/")
       classicSystem.actorSelection(pathToShard).tell(ClassicPassivate(stopMessage), classicRef)
diff --git a/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/internal/ReplicatedShardingExtensionImpl.scala b/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/internal/ReplicatedShardingExtensionImpl.scala
index 8f66a234d3..a69331442c 100644
--- a/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/internal/ReplicatedShardingExtensionImpl.scala
+++ b/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/internal/ReplicatedShardingExtensionImpl.scala
@@ -39,7 +39,7 @@ import org.slf4j.LoggerFactory
  * INTERNAL API
  */
 @InternalApi
-private[pekko] final class ReplicatedShardingExtensionImpl(system: ActorSystem[_]) extends ReplicatedShardingExtension {
+private[pekko] final class ReplicatedShardingExtensionImpl(system: ActorSystem[?]) extends ReplicatedShardingExtension {
 
   private val counter = new AtomicLong(0)
 
diff --git a/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/internal/ShardedDaemonProcessCoordinator.scala b/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/internal/ShardedDaemonProcessCoordinator.scala
index bda407ffef..bea64bff40 100644
--- a/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/internal/ShardedDaemonProcessCoordinator.scala
+++ b/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/internal/ShardedDaemonProcessCoordinator.scala
@@ -383,7 +383,7 @@ private final class ShardedDaemonProcessCoordinator private (
       sortedIdentities.foreach(id => shardingRef ! StartEntity(id))
       None
     } else {
-      implicit val system: ActorSystem[_] = context.system
+      implicit val system: ActorSystem[?] = context.system
       Some(
         Source(sortedIdentities)
           .viaMat(KillSwitches.single)(Keep.right)
diff --git a/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/internal/ShardedDaemonProcessImpl.scala b/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/internal/ShardedDaemonProcessImpl.scala
index fed10e2ab4..fb69fe2a8e 100644
--- a/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/internal/ShardedDaemonProcessImpl.scala
+++ b/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/internal/ShardedDaemonProcessImpl.scala
@@ -46,7 +46,7 @@ import pekko.cluster.typed.SingletonActor
  * INTERNAL API
  */
 @InternalApi
-private[pekko] final class ShardedDaemonProcessImpl(system: ActorSystem[_])
+private[pekko] final class ShardedDaemonProcessImpl(system: ActorSystem[?])
     extends javadsl.ShardedDaemonProcess
     with scaladsl.ShardedDaemonProcess {
 
diff --git a/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/internal/ShardingSerializer.scala b/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/internal/ShardingSerializer.scala
index a0158fe73d..3287d94929 100644
--- a/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/internal/ShardingSerializer.scala
+++ b/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/internal/ShardingSerializer.scala
@@ -50,7 +50,7 @@ import pekko.serialization.SerializerWithStringManifest
   private val GetNumberOfProcessesReplyManifest = "e"
 
   override def manifest(o: AnyRef): String = o match {
-    case _: ShardingEnvelope[_]       => ShardingEnvelopeManifest
+    case _: ShardingEnvelope[?]       => ShardingEnvelopeManifest
     case _: ShardedDaemonProcessState => DaemonProcessStateManifest
     case _: ChangeNumberOfProcesses   => ChangeNumberOfProcessesManifest
     case _: GetNumberOfProcesses      => GetNumberOfProcessesManifest
@@ -60,7 +60,7 @@ import pekko.serialization.SerializerWithStringManifest
   }
 
   override def toBinary(o: AnyRef): Array[Byte] = o match {
-    case env: ShardingEnvelope[_] =>
+    case env: ShardingEnvelope[?] =>
       val builder = ShardingMessages.ShardingEnvelope.newBuilder()
       builder.setEntityId(env.entityId)
       builder.setMessage(payloadSupport.payloadBuilder(env.message))
@@ -143,7 +143,7 @@ import pekko.serialization.SerializerWithStringManifest
 
   // buffer based avoiding a copy for artery
   override def toBinary(o: AnyRef, buf: ByteBuffer): Unit = o match {
-    case env: ShardingEnvelope[_] =>
+    case env: ShardingEnvelope[?] =>
       val builder = ShardingMessages.ShardingEnvelope.newBuilder()
       builder.setEntityId(env.entityId)
       builder.setMessage(payloadSupport.payloadBuilder(env.message))
diff --git a/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/internal/testkit/TestEntityRefImpl.scala b/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/internal/testkit/TestEntityRefImpl.scala
index 1ec48423c5..65b36b56a7 100644
--- a/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/internal/testkit/TestEntityRefImpl.scala
+++ b/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/internal/testkit/TestEntityRefImpl.scala
@@ -68,12 +68,12 @@ import pekko.util.Timeout
 
   // impl InternalRecipientRef
   override def provider: ActorRefProvider = {
-    probe.asInstanceOf[InternalRecipientRef[_]].provider
+    probe.asInstanceOf[InternalRecipientRef[?]].provider
   }
 
   // impl InternalRecipientRef
   def isTerminated: Boolean = {
-    probe.asInstanceOf[InternalRecipientRef[_]].isTerminated
+    probe.asInstanceOf[InternalRecipientRef[?]].isTerminated
   }
 
   override def toString: String = s"TestEntityRef($entityId)"
diff --git a/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/javadsl/ClusterSharding.scala b/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/javadsl/ClusterSharding.scala
index c70d3e8b45..7a41f057b9 100644
--- a/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/javadsl/ClusterSharding.scala
+++ b/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/javadsl/ClusterSharding.scala
@@ -41,7 +41,7 @@ trait EntityFactory[M] {
 }
 
 object ClusterSharding {
-  def get(system: ActorSystem[_]): ClusterSharding =
+  def get(system: ActorSystem[?]): ClusterSharding =
     scaladsl.ClusterSharding(system).asJava
 
   /**
diff --git a/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/javadsl/ShardedDaemonProcess.scala b/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/javadsl/ShardedDaemonProcess.scala
index 408922f2ef..e7e48ed9ce 100644
--- a/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/javadsl/ShardedDaemonProcess.scala
+++ b/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/javadsl/ShardedDaemonProcess.scala
@@ -29,7 +29,7 @@ import pekko.cluster.sharding.typed.ShardedDaemonProcessContext
 import pekko.cluster.sharding.typed.ShardedDaemonProcessSettings
 
 object ShardedDaemonProcess {
-  def get(system: ActorSystem[_]): ShardedDaemonProcess =
+  def get(system: ActorSystem[?]): ShardedDaemonProcess =
     pekko.cluster.sharding.typed.scaladsl.ShardedDaemonProcess(system).asJava
 }
 
diff --git a/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/scaladsl/ClusterSharding.scala b/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/scaladsl/ClusterSharding.scala
index 83c9b825b0..5fbd1d5856 100644
--- a/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/scaladsl/ClusterSharding.scala
+++ b/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/scaladsl/ClusterSharding.scala
@@ -39,7 +39,7 @@ import pekko.util.Timeout
 
 object ClusterSharding extends ExtensionId[ClusterSharding] {
 
-  override def createExtension(system: ActorSystem[_]): ClusterSharding =
+  override def createExtension(system: ActorSystem[?]): ClusterSharding =
     new ClusterShardingImpl(system)
 
   /**
@@ -539,7 +539,7 @@ object EntityTypeKey {
 }
 
 object ClusterShardingSetup {
-  def apply[T <: Extension](createExtension: ActorSystem[_] => ClusterSharding): ClusterShardingSetup =
+  def apply[T <: Extension](createExtension: ActorSystem[?] => ClusterSharding): ClusterShardingSetup =
     new ClusterShardingSetup(createExtension(_))
 
 }
@@ -549,5 +549,5 @@ object ClusterShardingSetup {
  * to replace the default implementation of the [[ClusterSharding]] extension. Intended
  * for tests that need to replace extension with stub/mock implementations.
  */
-final class ClusterShardingSetup(createExtension: java.util.function.Function[ActorSystem[_], ClusterSharding])
+final class ClusterShardingSetup(createExtension: java.util.function.Function[ActorSystem[?], ClusterSharding])
     extends ExtensionSetup[ClusterSharding](ClusterSharding, createExtension)
diff --git a/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/scaladsl/ShardedDaemonProcess.scala b/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/scaladsl/ShardedDaemonProcess.scala
index 7155223f59..2f742b25a2 100644
--- a/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/scaladsl/ShardedDaemonProcess.scala
+++ b/cluster-sharding-typed/src/main/scala/org/apache/pekko/cluster/sharding/typed/scaladsl/ShardedDaemonProcess.scala
@@ -32,7 +32,7 @@ import pekko.cluster.sharding.typed.internal.ShardedDaemonProcessImpl
 import pekko.cluster.sharding.typed.javadsl
 
 object ShardedDaemonProcess extends ExtensionId[ShardedDaemonProcess] {
-  override def createExtension(system: ActorSystem[_]): ShardedDaemonProcess = new ShardedDaemonProcessImpl(system)
+  override def createExtension(system: ActorSystem[?]): ShardedDaemonProcess = new ShardedDaemonProcessImpl(system)
 }
 
 /**
diff --git a/cluster-sharding-typed/src/test/scala/docs/org/apache/pekko/cluster/sharding/typed/DurableStateStoreQueryUsageCompileOnlySpec.scala b/cluster-sharding-typed/src/test/scala/docs/org/apache/pekko/cluster/sharding/typed/DurableStateStoreQueryUsageCompileOnlySpec.scala
index c43d313469..9fe939082c 100644
--- a/cluster-sharding-typed/src/test/scala/docs/org/apache/pekko/cluster/sharding/typed/DurableStateStoreQueryUsageCompileOnlySpec.scala
+++ b/cluster-sharding-typed/src/test/scala/docs/org/apache/pekko/cluster/sharding/typed/DurableStateStoreQueryUsageCompileOnlySpec.scala
@@ -35,7 +35,7 @@ object DurableStateStoreQueryUsageCompileOnlySpec {
     val source: Source[DurableStateChange[Record], NotUsed] = durableStateStoreQuery.changes("tag", offset)
     source.map {
       case UpdatedDurableState(persistenceId, revision, value, offset, timestamp) => Some(value)
-      case _: DeletedDurableState[_]                                              => None
+      case _: DeletedDurableState[?]                                              => None
     }
     // #get-durable-state-store-query-example
   }
diff --git a/cluster-sharding-typed/src/test/scala/docs/org/apache/pekko/cluster/sharding/typed/ExternalShardAllocationCompileOnlySpec.scala b/cluster-sharding-typed/src/test/scala/docs/org/apache/pekko/cluster/sharding/typed/ExternalShardAllocationCompileOnlySpec.scala
index 36d109a657..a134e650b9 100644
--- a/cluster-sharding-typed/src/test/scala/docs/org/apache/pekko/cluster/sharding/typed/ExternalShardAllocationCompileOnlySpec.scala
+++ b/cluster-sharding-typed/src/test/scala/docs/org/apache/pekko/cluster/sharding/typed/ExternalShardAllocationCompileOnlySpec.scala
@@ -30,7 +30,7 @@ import docs.org.apache.pekko.cluster.sharding.typed.ShardingCompileOnlySpec.Basi
 import scala.concurrent.Future
 
 class ExternalShardAllocationCompileOnlySpec {
-  val system: ActorSystem[_] = ???
+  val system: ActorSystem[?] = ???
 
   val sharding = ClusterSharding(system)
 
diff --git a/cluster-sharding-typed/src/test/scala/docs/org/apache/pekko/cluster/sharding/typed/HelloWorldPersistentEntityExample.scala b/cluster-sharding-typed/src/test/scala/docs/org/apache/pekko/cluster/sharding/typed/HelloWorldPersistentEntityExample.scala
index e91e122428..5091dd5bfc 100644
--- a/cluster-sharding-typed/src/test/scala/docs/org/apache/pekko/cluster/sharding/typed/HelloWorldPersistentEntityExample.scala
+++ b/cluster-sharding-typed/src/test/scala/docs/org/apache/pekko/cluster/sharding/typed/HelloWorldPersistentEntityExample.scala
@@ -32,7 +32,7 @@ object HelloWorldPersistentEntityExample {
   import pekko.cluster.sharding.typed.scaladsl.Entity
   import pekko.util.Timeout
 
-  class HelloWorldService(system: ActorSystem[_]) {
+  class HelloWorldService(system: ActorSystem[?]) {
     import system.executionContext
 
     private val sharding = ClusterSharding(system)
diff --git a/cluster-sharding-typed/src/test/scala/docs/org/apache/pekko/cluster/sharding/typed/ReplicatedShardingCompileOnlySpec.scala b/cluster-sharding-typed/src/test/scala/docs/org/apache/pekko/cluster/sharding/typed/ReplicatedShardingCompileOnlySpec.scala
index 5145b0370b..28984bccd8 100644
--- a/cluster-sharding-typed/src/test/scala/docs/org/apache/pekko/cluster/sharding/typed/ReplicatedShardingCompileOnlySpec.scala
+++ b/cluster-sharding-typed/src/test/scala/docs/org/apache/pekko/cluster/sharding/typed/ReplicatedShardingCompileOnlySpec.scala
@@ -31,7 +31,7 @@ object ReplicatedShardingCompileOnlySpec {
 
   sealed trait Command
 
-  val system: ActorSystem[_] = ???
+  val system: ActorSystem[?] = ???
 
   object MyEventSourcedBehavior {
     def apply(replicationId: ReplicationId): Behavior[Command] = ???
diff --git a/cluster-sharding-typed/src/test/scala/org/apache/pekko/cluster/sharding/typed/JoinConfigCompatCheckerClusterShardingSpec.scala b/cluster-sharding-typed/src/test/scala/org/apache/pekko/cluster/sharding/typed/JoinConfigCompatCheckerClusterShardingSpec.scala
index 9430c300a1..17bb7741f8 100644
--- a/cluster-sharding-typed/src/test/scala/org/apache/pekko/cluster/sharding/typed/JoinConfigCompatCheckerClusterShardingSpec.scala
+++ b/cluster-sharding-typed/src/test/scala/org/apache/pekko/cluster/sharding/typed/JoinConfigCompatCheckerClusterShardingSpec.scala
@@ -62,10 +62,10 @@ class JoinConfigCompatCheckerClusterShardingSpec
 
   private val clusterWaitDuration = 5.seconds
 
-  private def configured(system: ActorSystem[_]): Int =
+  private def configured(system: ActorSystem[?]): Int =
     system.settings.config.getInt(Key)
 
-  private def join(sys: ActorSystem[_]): ClassicCluster = {
+  private def join(sys: ActorSystem[?]): ClassicCluster = {
     if (sys eq system) {
       configured(system) should ===(Shards)
       val seedNode = ClassicCluster(system)
diff --git a/cluster-sharding-typed/src/test/scala/org/apache/pekko/cluster/sharding/typed/ReplicatedShardingSpec.scala b/cluster-sharding-typed/src/test/scala/org/apache/pekko/cluster/sharding/typed/ReplicatedShardingSpec.scala
index a722c65175..0811ba1b46 100644
--- a/cluster-sharding-typed/src/test/scala/org/apache/pekko/cluster/sharding/typed/ReplicatedShardingSpec.scala
+++ b/cluster-sharding-typed/src/test/scala/org/apache/pekko/cluster/sharding/typed/ReplicatedShardingSpec.scala
@@ -265,7 +265,7 @@ abstract class ReplicatedShardingSpec(replicationType: ReplicationType, configA:
     }
 
     "start replicated sharding on both nodes" in {
-      def start(sys: ActorSystem[_]) = {
+      def start(sys: ActorSystem[?]) = {
         ReplicatedShardingExtension(sys).init(MyReplicatedStringSet.provider(replicationType))
         ReplicatedShardingExtension(sys).init(MyReplicatedIntSet.provider(replicationType))
       }
diff --git a/cluster-sharding-typed/src/test/scala/org/apache/pekko/cluster/sharding/typed/delivery/DurableShardingSpec.scala b/cluster-sharding-typed/src/test/scala/org/apache/pekko/cluster/sharding/typed/delivery/DurableShardingSpec.scala
index 48bd8b5962..d9c6ac12c4 100644
--- a/cluster-sharding-typed/src/test/scala/org/apache/pekko/cluster/sharding/typed/delivery/DurableShardingSpec.scala
+++ b/cluster-sharding-typed/src/test/scala/org/apache/pekko/cluster/sharding/typed/delivery/DurableShardingSpec.scala
@@ -116,7 +116,7 @@ class DurableShardingSpec
       (1 to 4).foreach { n =>
         producerProbe.receiveMessage().sendNextTo ! ShardingEnvelope("entity-1", TestConsumer.Job(s"msg-$n"))
         journalOperations.expectMessageType[InmemJournal.Write].event.getClass should ===(
-          classOf[DurableProducerQueue.MessageSent[_]])
+          classOf[DurableProducerQueue.MessageSent[?]])
       }
 
       journalOperations.expectNoMessage()
@@ -185,7 +185,7 @@ class DurableShardingSpec
       val next5 = producerProbe.receiveMessage()
       next5.sendNextTo ! ShardingEnvelope("entity-1", TestConsumer.Job(s"msg-5"))
       journalOperations.expectMessageType[InmemJournal.Write].event.getClass should ===(
-        classOf[DurableProducerQueue.MessageSent[_]])
+        classOf[DurableProducerQueue.MessageSent[?]])
 
       // issue #30489: the consumer controller may have stopped after msg-5, so allow for resend on timeout (10-15s)
       val delivery5 = consumerProbe.receiveMessage(20.seconds)
@@ -227,7 +227,7 @@ class DurableShardingSpec
         TestConsumer.Job(s"msg-1"),
         replyProbe.ref)
       journalOperations.expectMessageType[InmemJournal.Write].event.getClass should ===(
-        classOf[DurableProducerQueue.MessageSent[_]])
+        classOf[DurableProducerQueue.MessageSent[?]])
       replyProbe.expectMessage(Done)
 
       producerProbe.receiveMessage().askNextTo ! MessageWithConfirmation(
@@ -235,7 +235,7 @@ class DurableShardingSpec
         TestConsumer.Job(s"msg-2"),
         replyProbe.ref)
       journalOperations.expectMessageType[InmemJournal.Write].event.getClass should ===(
-        classOf[DurableProducerQueue.MessageSent[_]])
+        classOf[DurableProducerQueue.MessageSent[?]])
       replyProbe.expectMessage(Done)
 
       testKit.stop(shardingProducerController)
diff --git a/cluster-sharding-typed/src/test/scala/org/apache/pekko/cluster/sharding/typed/scaladsl/ClusterShardingPersistenceSpec.scala b/cluster-sharding-typed/src/test/scala/org/apache/pekko/cluster/sharding/typed/scaladsl/ClusterShardingPersistenceSpec.scala
index a44a4412e7..229374a70a 100644
--- a/cluster-sharding-typed/src/test/scala/org/apache/pekko/cluster/sharding/typed/scaladsl/ClusterShardingPersistenceSpec.scala
+++ b/cluster-sharding-typed/src/test/scala/org/apache/pekko/cluster/sharding/typed/scaladsl/ClusterShardingPersistenceSpec.scala
@@ -167,7 +167,7 @@ class ClusterShardingPersistenceSpec
     _entityId.toString
   }
 
-  private def awaitEntityTerminatedAndRemoved(ref: ActorRef[_], entityId: String): Unit = {
+  private def awaitEntityTerminatedAndRemoved(ref: ActorRef[?], entityId: String): Unit = {
     val p = TestProbe[Any]()
     p.expectTerminated(ref, p.remainingOrDefault)
 
diff --git a/cluster-sharding/src/main/scala/org/apache/pekko/cluster/sharding/ShardingFlightRecorder.scala b/cluster-sharding/src/main/scala/org/apache/pekko/cluster/sharding/ShardingFlightRecorder.scala
index 29bb1a6c77..52bd659492 100644
--- a/cluster-sharding/src/main/scala/org/apache/pekko/cluster/sharding/ShardingFlightRecorder.scala
+++ b/cluster-sharding/src/main/scala/org/apache/pekko/cluster/sharding/ShardingFlightRecorder.scala
@@ -23,7 +23,7 @@ import pekko.util.FlightRecorderLoader
 @InternalApi
 object ShardingFlightRecorder extends ExtensionId[ShardingFlightRecorder] with ExtensionIdProvider {
 
-  override def lookup: ExtensionId[_ <: Extension] = this
+  override def lookup: ExtensionId[? <: Extension] = this
 
   override def createExtension(system: ExtendedActorSystem): ShardingFlightRecorder =
     FlightRecorderLoader.load[ShardingFlightRecorder](
diff --git a/cluster-sharding/src/multi-jvm/scala/org/apache/pekko/cluster/sharding/MultiNodeClusterShardingConfig.scala b/cluster-sharding/src/multi-jvm/scala/org/apache/pekko/cluster/sharding/MultiNodeClusterShardingConfig.scala
index 16ec015e77..8db34c6839 100644
--- a/cluster-sharding/src/multi-jvm/scala/org/apache/pekko/cluster/sharding/MultiNodeClusterShardingConfig.scala
+++ b/cluster-sharding/src/multi-jvm/scala/org/apache/pekko/cluster/sharding/MultiNodeClusterShardingConfig.scala
@@ -24,7 +24,7 @@ import com.typesafe.config.{ Config, ConfigFactory }
 
 object MultiNodeClusterShardingConfig {
 
-  private[sharding] def testNameFromCallStack(classToStartFrom: Class[_]): String = {
+  private[sharding] def testNameFromCallStack(classToStartFrom: Class[?]): String = {
 
     def isAbstractClass(className: String): Boolean = {
       try {
diff --git a/cluster-sharding/src/test/scala/org/apache/pekko/cluster/sharding/ShardingQueriesSpec.scala b/cluster-sharding/src/test/scala/org/apache/pekko/cluster/sharding/ShardingQueriesSpec.scala
index 112b32ef17..01dd8006cb 100644
--- a/cluster-sharding/src/test/scala/org/apache/pekko/cluster/sharding/ShardingQueriesSpec.scala
+++ b/cluster-sharding/src/test/scala/org/apache/pekko/cluster/sharding/ShardingQueriesSpec.scala
@@ -27,13 +27,13 @@ class ShardingQueriesSpec extends PekkoSpec {
 
   "ShardsQueryResult" must {
 
-    def nonEmpty(qr: ShardsQueryResult[_]): Boolean =
+    def nonEmpty(qr: ShardsQueryResult[?]): Boolean =
       qr.total > 0 && qr.queried > 0
 
-    def isTotalFailed(qr: ShardsQueryResult[_]): Boolean =
+    def isTotalFailed(qr: ShardsQueryResult[?]): Boolean =
       nonEmpty(qr) && qr.failed.size == qr.total
 
-    def isAllSubsetFailed(qr: ShardsQueryResult[_]): Boolean =
+    def isAllSubsetFailed(qr: ShardsQueryResult[?]): Boolean =
       nonEmpty(qr) && qr.queried < qr.total && qr.failed.size == qr.queried
 
     "reflect nothing to acquire metadata from - 0 shards" in {
diff --git a/cluster-typed/src/main/scala/org/apache/pekko/cluster/ddata/typed/internal/ReplicatorBehavior.scala b/cluster-typed/src/main/scala/org/apache/pekko/cluster/ddata/typed/internal/ReplicatorBehavior.scala
index d245699ca8..24debd520d 100644
--- a/cluster-typed/src/main/scala/org/apache/pekko/cluster/ddata/typed/internal/ReplicatorBehavior.scala
+++ b/cluster-typed/src/main/scala/org/apache/pekko/cluster/ddata/typed/internal/ReplicatorBehavior.scala
@@ -77,7 +77,7 @@ import pekko.util.Timeout
         Behaviors
           .receive[SReplicator.Command] { (ctx, msg) =>
             msg match {
-              case cmd: SReplicator.Get[_] =>
+              case cmd: SReplicator.Get[?] =>
                 classicReplicator.tell(dd.Replicator.Get(cmd.key, cmd.consistency), sender = cmd.replyTo.toClassic)
                 Behaviors.same
 
@@ -102,7 +102,7 @@ import pekko.util.Timeout
                 reply.foreach { cmd.replyTo ! _ }
                 Behaviors.same
 
-              case cmd: SReplicator.Update[_] =>
+              case cmd: SReplicator.Update[?] =>
                 classicReplicator.tell(
                   dd.Replicator.Update(cmd.key, cmd.writeConsistency, None)(cmd.modify),
                   sender = cmd.replyTo.toClassic)
@@ -131,7 +131,7 @@ import pekko.util.Timeout
                 reply.foreach { cmd.replyTo ! _ }
                 Behaviors.same
 
-              case cmd: SReplicator.Subscribe[_] =>
+              case cmd: SReplicator.Subscribe[?] =>
                 // For the Scala API the SubscribeResponse messages can be sent directly to the subscriber
                 classicReplicator.tell(
                   dd.Replicator.Subscribe(cmd.key, cmd.subscriber.toClassic),
@@ -157,13 +157,13 @@ import pekko.util.Timeout
 
               case InternalSubscribeResponse(rsp, subscriber) =>
                 rsp match {
-                  case chg: dd.Replicator.Changed[_] => subscriber ! JReplicator.Changed(chg.key)(chg.dataValue)
-                  case del: dd.Replicator.Deleted[_] => subscriber ! JReplicator.Deleted(del.key)
-                  case exp: dd.Replicator.Expired[_] => subscriber ! JReplicator.Expired(exp.key)
+                  case chg: dd.Replicator.Changed[?] => subscriber ! JReplicator.Changed(chg.key)(chg.dataValue)
+                  case del: dd.Replicator.Deleted[?] => subscriber ! JReplicator.Deleted(del.key)
+                  case exp: dd.Replicator.Expired[?] => subscriber ! JReplicator.Expired(exp.key)
                 }
                 Behaviors.same
 
-              case cmd: SReplicator.Unsubscribe[_] =>
+              case cmd: SReplicator.Unsubscribe[?] =>
                 classicReplicator.tell(
                   dd.Replicator.Unsubscribe(cmd.key, cmd.subscriber.toClassic),
                   sender = cmd.subscriber.toClassic)
@@ -172,7 +172,7 @@ import pekko.util.Timeout
               case cmd: JReplicator.Unsubscribe[ReplicatedData] @unchecked =>
                 stopSubscribeAdapter(cmd.subscriber)
 
-              case cmd: SReplicator.Delete[_] =>
+              case cmd: SReplicator.Delete[?] =>
                 classicReplicator.tell(dd.Replicator.Delete(cmd.key, cmd.consistency), sender = cmd.replyTo.toClassic)
                 Behaviors.same
 
diff --git a/cluster-typed/src/main/scala/org/apache/pekko/cluster/ddata/typed/javadsl/DistributedData.scala b/cluster-typed/src/main/scala/org/apache/pekko/cluster/ddata/typed/javadsl/DistributedData.scala
index 622bbc45e2..33799cb01e 100644
--- a/cluster-typed/src/main/scala/org/apache/pekko/cluster/ddata/typed/javadsl/DistributedData.scala
+++ b/cluster-typed/src/main/scala/org/apache/pekko/cluster/ddata/typed/javadsl/DistributedData.scala
@@ -31,9 +31,9 @@ import pekko.cluster.ddata.ReplicatedData
 import pekko.cluster.ddata.SelfUniqueAddress
 
 object DistributedData extends ExtensionId[DistributedData] {
-  def get(system: ActorSystem[_]): DistributedData = apply(system)
+  def get(system: ActorSystem[?]): DistributedData = apply(system)
 
-  override def createExtension(system: ActorSystem[_]): DistributedData =
+  override def createExtension(system: ActorSystem[?]): DistributedData =
     new DistributedDataImpl(system)
 
   /**
@@ -98,7 +98,7 @@ abstract class DistributedData extends Extension {
 /**
  * INTERNAL API
  */
-@InternalApi private[pekko] class DistributedDataImpl(system: ActorSystem[_]) extends DistributedData {
+@InternalApi private[pekko] class DistributedDataImpl(system: ActorSystem[?]) extends DistributedData {
 
   override val replicator: ActorRef[Replicator.Command] =
     pekko.cluster.ddata.typed.scaladsl.DistributedData(system).replicator.narrow[Replicator.Command]
@@ -109,7 +109,7 @@ abstract class DistributedData extends Extension {
 }
 
 object DistributedDataSetup {
-  def apply[T <: Extension](createExtension: ActorSystem[_] => DistributedData): DistributedDataSetup =
+  def apply[T <: Extension](createExtension: ActorSystem[?] => DistributedData): DistributedDataSetup =
     new DistributedDataSetup(createExtension(_))
 
 }
@@ -119,5 +119,5 @@ object DistributedDataSetup {
  * to replace the default implementation of the [[DistributedData]] extension. Intended
  * for tests that need to replace extension with stub/mock implementations.
  */
-final class DistributedDataSetup(createExtension: java.util.function.Function[ActorSystem[_], DistributedData])
+final class DistributedDataSetup(createExtension: java.util.function.Function[ActorSystem[?], DistributedData])
     extends ExtensionSetup[DistributedData](DistributedData, createExtension)
diff --git a/cluster-typed/src/main/scala/org/apache/pekko/cluster/ddata/typed/javadsl/ReplicatorSettings.scala b/cluster-typed/src/main/scala/org/apache/pekko/cluster/ddata/typed/javadsl/ReplicatorSettings.scala
index 4b2ca8ceea..d6bbda3647 100644
--- a/cluster-typed/src/main/scala/org/apache/pekko/cluster/ddata/typed/javadsl/ReplicatorSettings.scala
+++ b/cluster-typed/src/main/scala/org/apache/pekko/cluster/ddata/typed/javadsl/ReplicatorSettings.scala
@@ -26,7 +26,7 @@ object ReplicatorSettings {
    * Create settings from the default configuration
    * `pekko.cluster.distributed-data`.
    */
-  def create(system: ActorSystem[_]): dd.ReplicatorSettings =
+  def create(system: ActorSystem[?]): dd.ReplicatorSettings =
     dd.ReplicatorSettings(system.toClassic)
 
   /**
diff --git a/cluster-typed/src/main/scala/org/apache/pekko/cluster/ddata/typed/scaladsl/DistributedData.scala b/cluster-typed/src/main/scala/org/apache/pekko/cluster/ddata/typed/scaladsl/DistributedData.scala
index b0b63f73ce..74819d18f6 100644
--- a/cluster-typed/src/main/scala/org/apache/pekko/cluster/ddata/typed/scaladsl/DistributedData.scala
+++ b/cluster-typed/src/main/scala/org/apache/pekko/cluster/ddata/typed/scaladsl/DistributedData.scala
@@ -31,9 +31,9 @@ import pekko.cluster.ddata.SelfUniqueAddress
 import org.slf4j.LoggerFactory
 
 object DistributedData extends ExtensionId[DistributedData] {
-  def get(system: ActorSystem[_]): DistributedData = apply(system)
+  def get(system: ActorSystem[?]): DistributedData = apply(system)
 
-  override def createExtension(system: ActorSystem[_]): DistributedData =
+  override def createExtension(system: ActorSystem[?]): DistributedData =
     new DistributedData(system)
 
   /**
@@ -76,7 +76,7 @@ object DistributedData extends ExtensionId[DistributedData] {
  * [[pekko.cluster.ddata.DistributedData]] and that means that typed
  * and classic actors can share the same data.
  */
-class DistributedData(system: ActorSystem[_]) extends Extension {
+class DistributedData(system: ActorSystem[?]) extends Extension {
   import pekko.actor.typed.scaladsl.adapter._
 
   private val settings: ReplicatorSettings = ReplicatorSettings(system)
diff --git a/cluster-typed/src/main/scala/org/apache/pekko/cluster/ddata/typed/scaladsl/ReplicatorSettings.scala b/cluster-typed/src/main/scala/org/apache/pekko/cluster/ddata/typed/scaladsl/ReplicatorSettings.scala
index 6931ce3ff5..f3718c7dfa 100644
--- a/cluster-typed/src/main/scala/org/apache/pekko/cluster/ddata/typed/scaladsl/ReplicatorSettings.scala
+++ b/cluster-typed/src/main/scala/org/apache/pekko/cluster/ddata/typed/scaladsl/ReplicatorSettings.scala
@@ -30,7 +30,7 @@ object ReplicatorSettings {
    * Create settings from the default configuration
    * `pekko.cluster.distributed-data`.
    */
-  def apply(system: ActorSystem[_]): ReplicatorSettings =
+  def apply(system: ActorSystem[?]): ReplicatorSettings =
     dd.ReplicatorSettings(system.toClassic)
 
   /**
@@ -44,6 +44,6 @@ object ReplicatorSettings {
    * INTERNAL API
    * The name of the actor used in DistributedData extensions.
    */
-  @InternalApi private[pekko] def name(system: ActorSystem[_]): String =
+  @InternalApi private[pekko] def name(system: ActorSystem[?]): String =
     dd.ReplicatorSettings.name(system.toClassic, Some("typed"))
 }
diff --git a/cluster-typed/src/main/scala/org/apache/pekko/cluster/typed/Cluster.scala b/cluster-typed/src/main/scala/org/apache/pekko/cluster/typed/Cluster.scala
index 2bba600929..3ce7007863 100644
--- a/cluster-typed/src/main/scala/org/apache/pekko/cluster/typed/Cluster.scala
+++ b/cluster-typed/src/main/scala/org/apache/pekko/cluster/typed/Cluster.scala
@@ -213,12 +213,12 @@ case object PrepareForFullClusterShutdown extends PrepareForFullClusterShutdown
  */
 object Cluster extends ExtensionId[Cluster] {
 
-  def createExtension(system: ActorSystem[_]): Cluster = new AdapterClusterImpl(system)
+  def createExtension(system: ActorSystem[?]): Cluster = new AdapterClusterImpl(system)
 
   /**
    * Java API
    */
-  def get(system: ActorSystem[_]): Cluster = apply(system)
+  def get(system: ActorSystem[?]): Cluster = apply(system)
 }
 
 /**
@@ -251,7 +251,7 @@ abstract class Cluster extends Extension {
 }
 
 object ClusterSetup {
-  def apply[T <: Extension](createExtension: ActorSystem[_] => Cluster): ClusterSetup =
+  def apply[T <: Extension](createExtension: ActorSystem[?] => Cluster): ClusterSetup =
     new ClusterSetup(createExtension(_))
 
 }
@@ -261,5 +261,5 @@ object ClusterSetup {
  * to replace the default implementation of the [[Cluster]] extension. Intended
  * for tests that need to replace extension with stub/mock implementations.
  */
-final class ClusterSetup(createExtension: java.util.function.Function[ActorSystem[_], Cluster])
+final class ClusterSetup(createExtension: java.util.function.Function[ActorSystem[?], Cluster])
     extends ExtensionSetup[Cluster](Cluster, createExtension)
diff --git a/cluster-typed/src/main/scala/org/apache/pekko/cluster/typed/ClusterSingleton.scala b/cluster-typed/src/main/scala/org/apache/pekko/cluster/typed/ClusterSingleton.scala
index 33d620ea75..1a3b122a6c 100644
--- a/cluster-typed/src/main/scala/org/apache/pekko/cluster/typed/ClusterSingleton.scala
+++ b/cluster-typed/src/main/scala/org/apache/pekko/cluster/typed/ClusterSingleton.scala
@@ -30,13 +30,13 @@ import pekko.coordination.lease.LeaseUsageSettings
 import com.typesafe.config.Config
 
 object ClusterSingletonSettings {
-  def apply(system: ActorSystem[_]): ClusterSingletonSettings =
+  def apply(system: ActorSystem[?]): ClusterSingletonSettings =
     fromConfig(system.settings.config.getConfig("pekko.cluster"))
 
   /**
    * Java API
    */
-  def create(system: ActorSystem[_]): ClusterSingletonSettings = apply(system)
+  def create(system: ActorSystem[?]): ClusterSingletonSettings = apply(system)
 
   def fromConfig(config: Config): ClusterSingletonSettings = {
     // TODO introduce a config namespace for typed singleton and read that?
@@ -134,12 +134,12 @@ final class ClusterSingletonSettings(
 
 object ClusterSingleton extends ExtensionId[ClusterSingleton] {
 
-  override def createExtension(system: ActorSystem[_]): ClusterSingleton = new AdaptedClusterSingletonImpl(system)
+  override def createExtension(system: ActorSystem[?]): ClusterSingleton = new AdaptedClusterSingletonImpl(system)
 
   /**
    * Java API:
    */
-  def get(system: ActorSystem[_]): ClusterSingleton = apply(system)
+  def get(system: ActorSystem[?]): ClusterSingleton = apply(system)
 }
 
 /**
@@ -226,7 +226,7 @@ object ClusterSingletonManagerSettings {
    * Create settings from the default configuration
    * `pekko.cluster.singleton`.
    */
-  def apply(system: ActorSystem[_]): ClusterSingletonManagerSettings =
+  def apply(system: ActorSystem[?]): ClusterSingletonManagerSettings =
     apply(system.settings.config.getConfig("pekko.cluster.singleton"))
       .withRemovalMargin(pekko.cluster.Cluster(system).downingProvider.downRemovalMargin)
 
@@ -252,7 +252,7 @@ object ClusterSingletonManagerSettings {
    * Java API: Create settings from the default configuration
    * `pekko.cluster.singleton`.
    */
-  def create(system: ActorSystem[_]): ClusterSingletonManagerSettings = apply(system)
+  def create(system: ActorSystem[?]): ClusterSingletonManagerSettings = apply(system)
 
   /**
    * Java API: Create settings from a configuration with the same layout as
@@ -324,7 +324,7 @@ final class ClusterSingletonManagerSettings(
 }
 
 object ClusterSingletonSetup {
-  def apply[T <: Extension](createExtension: ActorSystem[_] => ClusterSingleton): ClusterSingletonSetup =
+  def apply[T <: Extension](createExtension: ActorSystem[?] => ClusterSingleton): ClusterSingletonSetup =
     new ClusterSingletonSetup(createExtension(_))
 
 }
@@ -334,5 +334,5 @@ object ClusterSingletonSetup {
  * to replace the default implementation of the [[ClusterSingleton]] extension. Intended
  * for tests that need to replace extension with stub/mock implementations.
  */
-final class ClusterSingletonSetup(createExtension: java.util.function.Function[ActorSystem[_], ClusterSingleton])
+final class ClusterSingletonSetup(createExtension: java.util.function.Function[ActorSystem[?], ClusterSingleton])
     extends ExtensionSetup[ClusterSingleton](ClusterSingleton, createExtension)
diff --git a/cluster-typed/src/main/scala/org/apache/pekko/cluster/typed/internal/AdaptedClusterImpl.scala b/cluster-typed/src/main/scala/org/apache/pekko/cluster/typed/internal/AdaptedClusterImpl.scala
index 2f4dd46874..7d8974e093 100644
--- a/cluster-typed/src/main/scala/org/apache/pekko/cluster/typed/internal/AdaptedClusterImpl.scala
+++ b/cluster-typed/src/main/scala/org/apache/pekko/cluster/typed/internal/AdaptedClusterImpl.scala
@@ -159,10 +159,10 @@ private[pekko] object AdapterClusterImpl {
  * INTERNAL API:
  */
 @InternalApi
-private[pekko] final class AdapterClusterImpl(system: ActorSystem[_]) extends Cluster {
+private[pekko] final class AdapterClusterImpl(system: ActorSystem[?]) extends Cluster {
   import AdapterClusterImpl._
 
-  require(system.isInstanceOf[ActorSystemAdapter[_]], "only adapted actor systems can be used for cluster features")
+  require(system.isInstanceOf[ActorSystemAdapter[?]], "only adapted actor systems can be used for cluster features")
   private val classicCluster = pekko.cluster.Cluster(system)
 
   override def selfMember: Member = classicCluster.selfMember
diff --git a/cluster-typed/src/main/scala/org/apache/pekko/cluster/typed/internal/AdaptedClusterSingletonImpl.scala b/cluster-typed/src/main/scala/org/apache/pekko/cluster/typed/internal/AdaptedClusterSingletonImpl.scala
index 6d67d70671..032400e67d 100644
--- a/cluster-typed/src/main/scala/org/apache/pekko/cluster/typed/internal/AdaptedClusterSingletonImpl.scala
+++ b/cluster-typed/src/main/scala/org/apache/pekko/cluster/typed/internal/AdaptedClusterSingletonImpl.scala
@@ -32,9 +32,9 @@ import pekko.cluster.typed.{ Cluster, ClusterSingleton, ClusterSingletonImpl, Cl
  * INTERNAL API:
  */
 @InternalApi
-private[pekko] final class AdaptedClusterSingletonImpl(system: ActorSystem[_]) extends ClusterSingleton {
+private[pekko] final class AdaptedClusterSingletonImpl(system: ActorSystem[?]) extends ClusterSingleton {
   require(
-    system.isInstanceOf[ActorSystemAdapter[_]],
+    system.isInstanceOf[ActorSystemAdapter[?]],
     "only adapted actor systems can be used for the typed cluster singleton")
 
   import ClusterSingletonImpl._
@@ -44,7 +44,7 @@ private[pekko] final class AdaptedClusterSingletonImpl(system: ActorSystem[_]) e
   private lazy val cluster = Cluster(system)
   private val classicSystem = system.toClassic.asInstanceOf[ExtendedActorSystem]
 
-  private val proxies = new ConcurrentHashMap[(String, Option[DataCenter]), ActorRef[_]]()
+  private val proxies = new ConcurrentHashMap[(String, Option[DataCenter]), ActorRef[?]]()
 
   override def init[M](singleton: typed.SingletonActor[M]): ActorRef[M] = {
     val settings = singleton.settings match {
@@ -79,8 +79,8 @@ private[pekko] final class AdaptedClusterSingletonImpl(system: ActorSystem[_]) e
   }
 
   private def getProxy[T](name: String, settings: ClusterSingletonSettings): ActorRef[T] = {
-    val proxyCreator = new JFunction[(String, Option[DataCenter]), ActorRef[_]] {
-      def apply(singletonNameAndDc: (String, Option[DataCenter])): ActorRef[_] = {
+    val proxyCreator = new JFunction[(String, Option[DataCenter]), ActorRef[?]] {
+      def apply(singletonNameAndDc: (String, Option[DataCenter])): ActorRef[?] = {
         val (singletonName, _) = singletonNameAndDc
         val proxyName = s"singletonProxy$singletonName-${settings.dataCenter.getOrElse("no-dc")}"
         classicSystem.systemActorOf(
diff --git a/cluster-typed/src/main/scala/org/apache/pekko/cluster/typed/internal/PekkoClusterTypedSerializer.scala b/cluster-typed/src/main/scala/org/apache/pekko/cluster/typed/internal/PekkoClusterTypedSerializer.scala
index 7fb850fa18..a915bed84d 100644
--- a/cluster-typed/src/main/scala/org/apache/pekko/cluster/typed/internal/PekkoClusterTypedSerializer.scala
+++ b/cluster-typed/src/main/scala/org/apache/pekko/cluster/typed/internal/PekkoClusterTypedSerializer.scala
@@ -43,14 +43,14 @@ private[pekko] final class PekkoClusterTypedSerializer(override val system: Exte
 
   override def manifest(o: AnyRef): String = o match {
     case _: Entry                         => ReceptionistEntryManifest
-    case _: TopicImpl.MessagePublished[_] => PubSubPublishManifest
+    case _: TopicImpl.MessagePublished[?] => PubSubPublishManifest
     case _                                =>
       throw new IllegalArgumentException(s"Can't serialize object of type ${o.getClass} in [${getClass.getName}]")
   }
 
   override def toBinary(o: AnyRef): Array[Byte] = o match {
     case e: Entry                         => receptionistEntryToBinary(e)
-    case m: TopicImpl.MessagePublished[_] => pubSubPublishToBinary(m)
+    case m: TopicImpl.MessagePublished[?] => pubSubPublishToBinary(m)
     case _                                =>
       throw new IllegalArgumentException(s"Cannot serialize object of type [${o.getClass.getName}]")
   }
@@ -63,7 +63,7 @@ private[pekko] final class PekkoClusterTypedSerializer(override val system: Exte
         s"Unimplemented deserialization of message with manifest [$manifest] in [${getClass.getName}]")
   }
 
-  private def pubSubPublishToBinary(m: TopicImpl.MessagePublished[_]): Array[Byte] = {
+  private def pubSubPublishToBinary(m: TopicImpl.MessagePublished[?]): Array[Byte] = {
     ClusterMessages.PubSubMessagePublished
       .newBuilder()
       .setMessage(payloadSupport.payloadBuilder(m.message))
@@ -83,7 +83,7 @@ private[pekko] final class PekkoClusterTypedSerializer(override val system: Exte
     b.build().toByteArray
   }
 
-  private def pubSubMessageFromBinary(bytes: Array[Byte]): TopicImpl.MessagePublished[_] = {
+  private def pubSubMessageFromBinary(bytes: Array[Byte]): TopicImpl.MessagePublished[?] = {
     val parsed = ClusterMessages.PubSubMessagePublished.parseFrom(bytes)
     val userMessage = payloadSupport.deserializePayload(parsed.getMessage)
     TopicImpl.MessagePublished(userMessage)
diff --git a/cluster-typed/src/main/scala/org/apache/pekko/cluster/typed/internal/delivery/ReliableDeliverySerializer.scala b/cluster-typed/src/main/scala/org/apache/pekko/cluster/typed/internal/delivery/ReliableDeliverySerializer.scala
index 52833bab61..218aef6e96 100644
--- a/cluster-typed/src/main/scala/org/apache/pekko/cluster/typed/internal/delivery/ReliableDeliverySerializer.scala
+++ b/cluster-typed/src/main/scala/org/apache/pekko/cluster/typed/internal/delivery/ReliableDeliverySerializer.scala
@@ -60,34 +60,34 @@ import pekko.serialization.SerializerWithStringManifest
   private val DurableQueueCleanupManifest = "i"
 
   override def manifest(o: AnyRef): String = o match {
-    case _: ConsumerController.SequencedMessage[_] => SequencedMessageManifest
+    case _: ConsumerController.SequencedMessage[?] => SequencedMessageManifest
     case _: ProducerControllerImpl.Ack             => AckManifest
     case _: ProducerControllerImpl.Request         => RequestManifest
     case _: ProducerControllerImpl.Resend          => ResendManifest
-    case _: ProducerController.RegisterConsumer[_] => RegisterConsumerManifest
-    case _: DurableProducerQueue.MessageSent[_]    => DurableQueueMessageSentManifest
+    case _: ProducerController.RegisterConsumer[?] => RegisterConsumerManifest
+    case _: DurableProducerQueue.MessageSent[?]    => DurableQueueMessageSentManifest
     case _: DurableProducerQueue.Confirmed         => DurableQueueConfirmedManifest
-    case _: DurableProducerQueue.State[_]          => DurableQueueStateManifest
+    case _: DurableProducerQueue.State[?]          => DurableQueueStateManifest
     case _: DurableProducerQueue.Cleanup           => DurableQueueCleanupManifest
     case _                                         =>
       throw new IllegalArgumentException(s"Can't serialize object of type ${o.getClass} in [${getClass.getName}]")
   }
 
   override def toBinary(o: AnyRef): Array[Byte] = o match {
-    case m: ConsumerController.SequencedMessage[_] => sequencedMessageToBinary(m)
+    case m: ConsumerController.SequencedMessage[?] => sequencedMessageToBinary(m)
     case m: ProducerControllerImpl.Ack             => ackToBinary(m)
     case m: ProducerControllerImpl.Request         => requestToBinary(m)
     case m: ProducerControllerImpl.Resend          => resendToBinary(m)
-    case m: ProducerController.RegisterConsumer[_] => registerConsumerToBinary(m)
-    case m: DurableProducerQueue.MessageSent[_]    => durableQueueMessageSentToBinary(m)
+    case m: ProducerController.RegisterConsumer[?] => registerConsumerToBinary(m)
+    case m: DurableProducerQueue.MessageSent[?]    => durableQueueMessageSentToBinary(m)
     case m: DurableProducerQueue.Confirmed         => durableQueueConfirmedToBinary(m)
-    case m: DurableProducerQueue.State[_]          => durableQueueStateToBinary(m)
+    case m: DurableProducerQueue.State[?]          => durableQueueStateToBinary(m)
     case m: DurableProducerQueue.Cleanup           => durableQueueCleanupToBinary(m)
     case _                                         =>
       throw new IllegalArgumentException(s"Cannot serialize object of type [${o.getClass.getName}]")
   }
 
-  private def sequencedMessageToBinary(m: ConsumerController.SequencedMessage[_]): Array[Byte] = {
+  private def sequencedMessageToBinary(m: ConsumerController.SequencedMessage[?]): Array[Byte] = {
     val b = ReliableDelivery.SequencedMessage.newBuilder()
     b.setProducerId(m.producerId)
     b.setSeqNr(m.seqNr)
@@ -136,17 +136,17 @@ import pekko.serialization.SerializerWithStringManifest
     b.build().toByteArray()
   }
 
-  private def registerConsumerToBinary(m: ProducerController.RegisterConsumer[_]): Array[Byte] = {
+  private def registerConsumerToBinary(m: ProducerController.RegisterConsumer[?]): Array[Byte] = {
     val b = ReliableDelivery.RegisterConsumer.newBuilder()
     b.setConsumerControllerRef(resolver.toSerializationFormat(m.consumerController))
     b.build().toByteArray()
   }
 
-  private def durableQueueMessageSentToBinary(m: DurableProducerQueue.MessageSent[_]): Array[Byte] = {
+  private def durableQueueMessageSentToBinary(m: DurableProducerQueue.MessageSent[?]): Array[Byte] = {
     durableQueueMessageSentToProto(m).toByteArray()
   }
 
-  private def durableQueueMessageSentToProto(m: DurableProducerQueue.MessageSent[_]): ReliableDelivery.MessageSent = {
+  private def durableQueueMessageSentToProto(m: DurableProducerQueue.MessageSent[?]): ReliableDelivery.MessageSent = {
     val b = ReliableDelivery.MessageSent.newBuilder()
     b.setSeqNr(m.seqNr)
     b.setQualifier(m.confirmationQualifier)
@@ -180,7 +180,7 @@ import pekko.serialization.SerializerWithStringManifest
     b.build()
   }
 
-  private def durableQueueStateToBinary(m: DurableProducerQueue.State[_]): Array[Byte] = {
+  private def durableQueueStateToBinary(m: DurableProducerQueue.State[?]): Array[Byte] = {
     val b = ReliableDelivery.State.newBuilder()
     b.setCurrentSeqNr(m.currentSeqNr)
     b.setHighestConfirmedSeqNr(m.highestConfirmedSeqNr)
diff --git a/cluster-typed/src/main/scala/org/apache/pekko/cluster/typed/internal/receptionist/ClusterReceptionist.scala b/cluster-typed/src/main/scala/org/apache/pekko/cluster/typed/internal/receptionist/ClusterReceptionist.scala
index 102f3abd00..474d82ee94 100644
--- a/cluster-typed/src/main/scala/org/apache/pekko/cluster/typed/internal/receptionist/ClusterReceptionist.scala
+++ b/cluster-typed/src/main/scala/org/apache/pekko/cluster/typed/internal/receptionist/ClusterReceptionist.scala
@@ -54,15 +54,15 @@ private[typed] object ClusterReceptionist extends ReceptionistBehaviorProvider {
 
   import ClusterReceptionistProtocol.SubscriptionsKV
   type SubscriptionRegistry = TypedMultiMap[AbstractServiceKey, SubscriptionsKV]
-  type DDataKey = ORMultiMapKey[ServiceKey[_], Entry]
+  type DDataKey = ORMultiMapKey[ServiceKey[?], Entry]
 
-  final val EmptyORMultiMap = ORMultiMap.empty[ServiceKey[_], Entry]
+  final val EmptyORMultiMap = ORMultiMap.empty[ServiceKey[?], Entry]
 
   override val name = "clusterReceptionist"
 
   // values contain system uid to make it possible to discern actors at the same
   // path in different incarnations of a cluster node
-  final case class Entry(ref: ActorRef[_], systemUid: Long)(val createdTimestamp: Long) {
+  final case class Entry(ref: ActorRef[?], systemUid: Long)(val createdTimestamp: Long) {
     def uniqueAddress(selfAddress: Address): UniqueAddress =
       if (ref.path.address.hasLocalScope) UniqueAddress(selfAddress, systemUid)
       else UniqueAddress(ref.path.address, systemUid)
@@ -79,7 +79,7 @@ private[typed] object ClusterReceptionist extends ReceptionistBehaviorProvider {
   private final case class NodeRemoved(addresses: UniqueAddress) extends InternalCommand
   private final case class NodeUnreachable(addresses: UniqueAddress) extends InternalCommand
   private final case class NodeReachable(addresses: UniqueAddress) extends InternalCommand
-  private final case class ChangeFromReplicator(key: DDataKey, value: ORMultiMap[ServiceKey[_], Entry])
+  private final case class ChangeFromReplicator(key: DDataKey, value: ORMultiMap[ServiceKey[?], Entry])
       extends InternalCommand
   private case object RemoveTick extends InternalCommand
   private case object PruneTombstonesTick extends InternalCommand
@@ -93,12 +93,12 @@ private[typed] object ClusterReceptionist extends ReceptionistBehaviorProvider {
    */
   final case class State(
       registry: ShardedServiceRegistry,
-      servicesPerActor: Map[ActorRef[_], Set[AbstractServiceKey]],
-      tombstones: Map[ActorRef[_], Set[(AbstractServiceKey, Deadline)]],
+      servicesPerActor: Map[ActorRef[?], Set[AbstractServiceKey]],
+      tombstones: Map[ActorRef[?], Set[(AbstractServiceKey, Deadline)]],
       subscriptions: SubscriptionRegistry) {
 
     /** tombstone all services actor is registered for */
-    def addTombstone(actor: ActorRef[_], deadline: Deadline): State = {
+    def addTombstone(actor: ActorRef[?], deadline: Deadline): State = {
       servicesPerActor.getOrElse(actor, Set.empty).foldLeft(this) { (state, key) =>
         state.addTombstone(actor.asInstanceOf[ActorRef[key.Protocol]], key.asServiceKey, deadline)
       }
@@ -116,7 +116,7 @@ private[typed] object ClusterReceptionist extends ReceptionistBehaviorProvider {
     def pruneTombstones(): State = {
       if (tombstones.isEmpty) this
       else {
-        val newTombstones: Map[ActorRef[_], Set[(AbstractServiceKey, Deadline)]] =
+        val newTombstones: Map[ActorRef[?], Set[(AbstractServiceKey, Deadline)]] =
           tombstones.foldLeft(tombstones) {
             case (acc, (actorRef, entries)) =>
               val entriesToKeep = entries.filter {
@@ -218,10 +218,10 @@ private[typed] object ClusterReceptionist extends ReceptionistBehaviorProvider {
         // subscribe to changes from other nodes
         val replicatorMessageAdapter: ActorRef[Replicator.ReplicatorMessage] =
           ctx.messageAdapter[Replicator.ReplicatorMessage] {
-            case changed: Replicator.Changed[_] @unchecked =>
+            case changed: Replicator.Changed[?] @unchecked =>
               ChangeFromReplicator(
                 changed.key.asInstanceOf[DDataKey],
-                changed.dataValue.asInstanceOf[ORMultiMap[ServiceKey[_], Entry]])
+                changed.dataValue.asInstanceOf[ORMultiMap[ServiceKey[?], Entry]])
             case _ => throw new IllegalArgumentException() // compiler exhaustiveness check pleaser
           }
 
diff --git a/cluster-typed/src/main/scala/org/apache/pekko/cluster/typed/internal/receptionist/ClusterReceptionistSettings.scala b/cluster-typed/src/main/scala/org/apache/pekko/cluster/typed/internal/receptionist/ClusterReceptionistSettings.scala
index b0f41a38a7..c775cf8b84 100644
--- a/cluster-typed/src/main/scala/org/apache/pekko/cluster/typed/internal/receptionist/ClusterReceptionistSettings.scala
+++ b/cluster-typed/src/main/scala/org/apache/pekko/cluster/typed/internal/receptionist/ClusterReceptionistSettings.scala
@@ -32,7 +32,7 @@ import com.typesafe.config.Config
  */
 @InternalApi
 private[pekko] object ClusterReceptionistSettings {
-  def apply(system: ActorSystem[_]): ClusterReceptionistSettings =
+  def apply(system: ActorSystem[?]): ClusterReceptionistSettings =
     apply(system.settings.config.getConfig("pekko.cluster.typed.receptionist"))
 
   def apply(config: Config): ClusterReceptionistSettings = {
diff --git a/cluster-typed/src/main/scala/org/apache/pekko/cluster/typed/internal/receptionist/Registry.scala b/cluster-typed/src/main/scala/org/apache/pekko/cluster/typed/internal/receptionist/Registry.scala
index 3f96258ead..4693a550ff 100644
--- a/cluster-typed/src/main/scala/org/apache/pekko/cluster/typed/internal/receptionist/Registry.scala
+++ b/cluster-typed/src/main/scala/org/apache/pekko/cluster/typed/internal/receptionist/Registry.scala
@@ -28,7 +28,7 @@ import pekko.cluster.typed.internal.receptionist.ClusterReceptionist.{ DDataKey,
 @InternalApi private[pekko] object ShardedServiceRegistry {
   def apply(numberOfKeys: Int): ShardedServiceRegistry = {
     val emptyRegistries = (0 until numberOfKeys).map { n =>
-      val key = ORMultiMapKey[ServiceKey[_], Entry](s"ReceptionistKey_$n")
+      val key = ORMultiMapKey[ServiceKey[?], Entry](s"ReceptionistKey_$n")
       key -> new ServiceRegistry(EmptyORMultiMap)
     }.toMap
     new ShardedServiceRegistry(emptyRegistries, Set.empty, Set.empty)
@@ -53,10 +53,10 @@ import pekko.cluster.typed.internal.receptionist.ClusterReceptionist.{ DDataKey,
 
   def allDdataKeys: Iterable[DDataKey] = keys
 
-  def ddataKeyFor(serviceKey: ServiceKey[_]): DDataKey =
+  def ddataKeyFor(serviceKey: ServiceKey[?]): DDataKey =
     keys(math.abs(serviceKey.id.hashCode() % serviceRegistries.size))
 
-  def allServices: Iterator[(ServiceKey[_], Set[Entry])] =
+  def allServices: Iterator[(ServiceKey[?], Set[Entry])] =
     serviceRegistries.valuesIterator.flatMap(_.entries.entries)
 
   def allEntries: Iterator[Entry] = allServices.flatMap(_._2)
@@ -113,7 +113,7 @@ import pekko.cluster.typed.internal.receptionist.ClusterReceptionist.{ DDataKey,
 /**
  * INTERNAL API
  */
-@InternalApi private[pekko] final case class ServiceRegistry(entries: ORMultiMap[ServiceKey[_], Entry]) extends AnyVal {
+@InternalApi private[pekko] final case class ServiceRegistry(entries: ORMultiMap[ServiceKey[?], Entry]) extends AnyVal {
 
   // let's hide all the ugly casts we can in here
   def actorRefsFor[T](key: AbstractServiceKey): Set[ActorRef[key.Protocol]] =
@@ -122,7 +122,7 @@ import pekko.cluster.typed.internal.receptionist.ClusterReceptionist.{ DDataKey,
   def entriesFor(key: AbstractServiceKey): Set[Entry] =
     entries.getOrElse(key.asServiceKey, Set.empty[Entry])
 
-  def keysFor(address: UniqueAddress)(implicit node: SelfUniqueAddress): Set[ServiceKey[_]] =
+  def keysFor(address: UniqueAddress)(implicit node: SelfUniqueAddress): Set[ServiceKey[?]] =
     entries.entries.collect {
       case (key, entries) if entries.exists(_.uniqueAddress(node.uniqueAddress.address) == address) =>
         key
@@ -144,7 +144,7 @@ import pekko.cluster.typed.internal.receptionist.ClusterReceptionist.{ DDataKey,
     }
   }
 
-  def toORMultiMap: ORMultiMap[ServiceKey[_], Entry] = entries
+  def toORMultiMap: ORMultiMap[ServiceKey[?], Entry] = entries
 
 }
 
diff --git a/cluster-typed/src/test/scala/docs/org/apache/pekko/cluster/typed/BasicClusterExampleSpec.scala b/cluster-typed/src/test/scala/docs/org/apache/pekko/cluster/typed/BasicClusterExampleSpec.scala
index e994ba5f92..7625095790 100644
--- a/cluster-typed/src/test/scala/docs/org/apache/pekko/cluster/typed/BasicClusterExampleSpec.scala
+++ b/cluster-typed/src/test/scala/docs/org/apache/pekko/cluster/typed/BasicClusterExampleSpec.scala
@@ -67,7 +67,7 @@ pekko {
      """).withFallback(configSystem1)
 
   def illustrateJoinSeedNodes(): Unit = {
-    val system: ActorSystem[_] = ???
+    val system: ActorSystem[?] = ???
 
     // #join-seed-nodes
     import pekko.actor.Address
@@ -82,15 +82,15 @@ pekko {
   }
 
   object Backend {
-    def apply(): Behavior[_] = Behaviors.empty
+    def apply(): Behavior[?] = Behaviors.empty
   }
 
   object Frontend {
-    def apply(): Behavior[_] = Behaviors.empty
+    def apply(): Behavior[?] = Behaviors.empty
   }
 
   def illustrateRoles(): Unit = {
-    val context: ActorContext[_] = ???
+    val context: ActorContext[?] = ???
 
     // #hasRole
     val selfMember = Cluster(context.system).selfMember
@@ -104,7 +104,7 @@ pekko {
 
   @nowarn("msg=never used")
   def illustrateDcAccess(): Unit = {
-    val system: ActorSystem[_] = ???
+    val system: ActorSystem[?] = ???
 
     // #dcAccess
     val cluster = Cluster(system)
diff --git a/cluster-typed/src/test/scala/docs/org/apache/pekko/cluster/typed/DistributedPubSubExample.scala b/cluster-typed/src/test/scala/docs/org/apache/pekko/cluster/typed/DistributedPubSubExample.scala
index ca85cb8b58..2b63a1e22f 100644
--- a/cluster-typed/src/test/scala/docs/org/apache/pekko/cluster/typed/DistributedPubSubExample.scala
+++ b/cluster-typed/src/test/scala/docs/org/apache/pekko/cluster/typed/DistributedPubSubExample.scala
@@ -306,13 +306,13 @@ object DistributedPubSubExample {
         pekko.loggers = ["org.apache.pekko.testkit.TestEventListener"]
     """)
 
-  def createCluster(nodes: List[ActorSystem[_]]): Unit = {
-    val clusterUp = (nodes: List[ActorSystem[_]], expected: Int) =>
+  def createCluster(nodes: List[ActorSystem[?]]): Unit = {
+    val clusterUp = (nodes: List[ActorSystem[?]], expected: Int) =>
       nodes.forall { s =>
         Cluster(s).state.members.count(_.status == MemberStatus.up) == expected
       }
 
-    val awaitClusterUp = (nodes: List[ActorSystem[_]], expected: Int) =>
+    val awaitClusterUp = (nodes: List[ActorSystem[?]], expected: Int) =>
       while (!clusterUp(nodes, expected)) {
         Thread.sleep(1000)
       }
diff --git a/cluster-typed/src/test/scala/org/apache/pekko/cluster/typed/GroupRouterSpec.scala b/cluster-typed/src/test/scala/org/apache/pekko/cluster/typed/GroupRouterSpec.scala
index 9c64b80618..5eba65cfca 100644
--- a/cluster-typed/src/test/scala/org/apache/pekko/cluster/typed/GroupRouterSpec.scala
+++ b/cluster-typed/src/test/scala/org/apache/pekko/cluster/typed/GroupRouterSpec.scala
@@ -49,7 +49,7 @@ object GroupRouterSpec {
   """)
 
   object PingActor {
-    case class Pong(workerActor: ActorRef[_]) extends CborSerializable
+    case class Pong(workerActor: ActorRef[?]) extends CborSerializable
     case class Ping(replyTo: ActorRef[Pong]) extends CborSerializable
 
     def apply(): Behavior[Ping] = Behaviors.receive {
@@ -61,8 +61,8 @@ object GroupRouterSpec {
 
   object Pinger {
     sealed trait Command
-    private case class SawPong(worker: ActorRef[_]) extends Command
-    case class DonePinging(pongs: Int, uniqueWorkers: Set[ActorRef[_]])
+    private case class SawPong(worker: ActorRef[?]) extends Command
+    case class DonePinging(pongs: Int, uniqueWorkers: Set[ActorRef[?]])
     def apply(
         router: ActorRef[PingActor.Ping],
         requestedPings: Int,
@@ -73,7 +73,7 @@ object GroupRouterSpec {
         }
         (0 to requestedPings).foreach(_ => router ! PingActor.Ping(pongAdapter))
         var pongs = 0
-        var uniqueWorkers = Set.empty[ActorRef[_]]
+        var uniqueWorkers = Set.empty[ActorRef[?]]
 
         Behaviors.receiveMessage {
           case SawPong(worker) =>
diff --git a/cluster/src/main/scala/org/apache/pekko/cluster/Cluster.scala b/cluster/src/main/scala/org/apache/pekko/cluster/Cluster.scala
index 40ccac5711..1fd9bd911b 100644
--- a/cluster/src/main/scala/org/apache/pekko/cluster/Cluster.scala
+++ b/cluster/src/main/scala/org/apache/pekko/cluster/Cluster.scala
@@ -270,7 +270,7 @@ class Cluster(val system: ExtendedActorSystem) extends Extension {
    * A snapshot of [[pekko.cluster.ClusterEvent.CurrentClusterState]]
    * will be sent to the subscriber as the first message.
    */
-  @varargs def subscribe(subscriber: ActorRef, to: Class[_]*): Unit =
+  @varargs def subscribe(subscriber: ActorRef, to: Class[?]*): Unit =
     subscribe(subscriber, initialStateMode = InitialStateAsSnapshot, to: _*)
 
   /**
@@ -288,7 +288,7 @@ class Cluster(val system: ExtendedActorSystem) extends Extension {
    *
    * Note that for large clusters it is more efficient to use `InitialStateAsSnapshot`.
    */
-  @varargs def subscribe(subscriber: ActorRef, initialStateMode: SubscriptionInitialStateMode, to: Class[_]*): Unit = {
+  @varargs def subscribe(subscriber: ActorRef, initialStateMode: SubscriptionInitialStateMode, to: Class[?]*): Unit = {
     require(to.length > 0, "at least one `ClusterDomainEvent` class is required")
     require(
       to.forall(classOf[ClusterDomainEvent].isAssignableFrom),
@@ -307,7 +307,7 @@ class Cluster(val system: ExtendedActorSystem) extends Extension {
    * Unsubscribe to a specific type of cluster domain events,
    * matching previous `subscribe` registration.
    */
-  def unsubscribe(subscriber: ActorRef, to: Class[_]): Unit =
+  def unsubscribe(subscriber: ActorRef, to: Class[?]): Unit =
     clusterCore ! InternalClusterAction.Unsubscribe(subscriber, Some(to))
 
   /**
diff --git a/cluster/src/main/scala/org/apache/pekko/cluster/ClusterDaemon.scala b/cluster/src/main/scala/org/apache/pekko/cluster/ClusterDaemon.scala
index 3bc92fde56..081b8c4216 100644
--- a/cluster/src/main/scala/org/apache/pekko/cluster/ClusterDaemon.scala
+++ b/cluster/src/main/scala/org/apache/pekko/cluster/ClusterDaemon.scala
@@ -192,9 +192,9 @@ private[cluster] object InternalClusterAction {
   final case class AddOnMemberRemovedListener(callback: Runnable) extends NoSerializationVerificationNeeded
 
   sealed trait SubscriptionMessage
-  final case class Subscribe(subscriber: ActorRef, initialStateMode: SubscriptionInitialStateMode, to: Set[Class[_]])
+  final case class Subscribe(subscriber: ActorRef, initialStateMode: SubscriptionInitialStateMode, to: Set[Class[?]])
       extends SubscriptionMessage
-  final case class Unsubscribe(subscriber: ActorRef, to: Option[Class[_]])
+  final case class Unsubscribe(subscriber: ActorRef, to: Option[Class[?]])
       extends SubscriptionMessage
       with DeadLetterSuppression
 
diff --git a/cluster/src/main/scala/org/apache/pekko/cluster/ClusterEvent.scala b/cluster/src/main/scala/org/apache/pekko/cluster/ClusterEvent.scala
index c8daba849f..48559f3195 100644
--- a/cluster/src/main/scala/org/apache/pekko/cluster/ClusterEvent.scala
+++ b/cluster/src/main/scala/org/apache/pekko/cluster/ClusterEvent.scala
@@ -705,7 +705,7 @@ private[cluster] final class ClusterDomainEventPublisher
     receiver ! state
   }
 
-  def subscribe(subscriber: ActorRef, initMode: SubscriptionInitialStateMode, to: Set[Class[_]]): Unit = {
+  def subscribe(subscriber: ActorRef, initMode: SubscriptionInitialStateMode, to: Set[Class[?]]): Unit = {
     initMode match {
       case InitialStateAsEvents =>
         def pub(event: AnyRef): Unit = {
@@ -720,7 +720,7 @@ private[cluster] final class ClusterDomainEventPublisher
     to.foreach { eventStream.subscribe(subscriber, _) }
   }
 
-  def unsubscribe(subscriber: ActorRef, to: Option[Class[_]]): Unit = to match {
+  def unsubscribe(subscriber: ActorRef, to: Option[Class[?]]): Unit = to match {
     case None    => eventStream.unsubscribe(subscriber)
     case Some(c) => eventStream.unsubscribe(subscriber, c)
   }
diff --git a/cluster/src/multi-jvm/scala/org/apache/pekko/cluster/SurviveNetworkInstabilitySpec.scala b/cluster/src/multi-jvm/scala/org/apache/pekko/cluster/SurviveNetworkInstabilitySpec.scala
index 980985de8e..ef1d35c605 100644
--- a/cluster/src/multi-jvm/scala/org/apache/pekko/cluster/SurviveNetworkInstabilitySpec.scala
+++ b/cluster/src/multi-jvm/scala/org/apache/pekko/cluster/SurviveNetworkInstabilitySpec.scala
@@ -103,7 +103,7 @@ abstract class SurviveNetworkInstabilitySpec
   private val remoteSettings = RARP(system).provider.remoteSettings
 
   @nowarn
-  def quarantinedEventClass: Class[_] =
+  def quarantinedEventClass: Class[?] =
     if (remoteSettings.Artery.Enabled)
       classOf[QuarantinedEvent]
     else
diff --git a/coordination/src/main/scala/org/apache/pekko/coordination/lease/scaladsl/LeaseProvider.scala b/coordination/src/main/scala/org/apache/pekko/coordination/lease/scaladsl/LeaseProvider.scala
index 22c9e20484..ddf770a7fb 100644
--- a/coordination/src/main/scala/org/apache/pekko/coordination/lease/scaladsl/LeaseProvider.scala
+++ b/coordination/src/main/scala/org/apache/pekko/coordination/lease/scaladsl/LeaseProvider.scala
@@ -116,7 +116,7 @@ final class LeaseProvider(system: ExtendedActorSystem) extends Extension {
         s
       case Failure(_: NoSuchMethodException) =>
         dynamicAccess.createInstanceFor[T](fqcn, immutable.Seq((classOf[LeaseSettings], leaseSettings)))
-      case f: Failure[_] =>
+      case f: Failure[?] =>
         f
     }
 
diff --git a/distributed-data/src/main/scala-3/org/apache/pekko/cluster/ddata/GSet.scala b/distributed-data/src/main/scala-3/org/apache/pekko/cluster/ddata/GSet.scala
index d1804b5ca5..18fc1eab66 100644
--- a/distributed-data/src/main/scala-3/org/apache/pekko/cluster/ddata/GSet.scala
+++ b/distributed-data/src/main/scala-3/org/apache/pekko/cluster/ddata/GSet.scala
@@ -52,7 +52,7 @@ final case class GSet[A] private (elements: Set[A])(override val delta: Option[G
    * Java API
    */
   def getElements(): java.util.Set[A] = {
-    import scala.jdk.CollectionConverters._
+    import scala.jdk.CollectionConverters.*
     elements.asJava
   }
 
@@ -79,8 +79,8 @@ final case class GSet[A] private (elements: Set[A])(override val delta: Option[G
   }
 
   override def merge(that: GSet[A]): GSet[A] =
-    if ((this eq that) || that.isAncestorOf(this)) this.clearAncestor()
-    else if (this.isAncestorOf(that)) that.clearAncestor()
+    if (this eq that) || that.isAncestorOf(this) then this.clearAncestor()
+    else if this.isAncestorOf(that) then that.clearAncestor()
     else {
       clearAncestor()
       new GSet[A](elements.union(that.elements))(None)
@@ -91,7 +91,7 @@ final case class GSet[A] private (elements: Set[A])(override val delta: Option[G
   override def zero: GSet[A] = GSet.empty
 
   override def resetDelta: GSet[A] =
-    if (delta.isEmpty) this
+    if delta.isEmpty then this
     else assignAncestor(new GSet[A](elements)(None))
 
   override def toString: String = s"G$elements"
diff --git a/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/Key.scala b/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/Key.scala
index 7891b7aeab..fecf115914 100644
--- a/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/Key.scala
+++ b/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/Key.scala
@@ -20,7 +20,7 @@ object Key {
   /**
    * Extract the [[Key#id]].
    */
-  def unapply(k: Key[_]): Option[String] = Some(k.id)
+  def unapply(k: Key[?]): Option[String] = Some(k.id)
 
   private[pekko] type KeyR = Key[ReplicatedData]
 
@@ -44,7 +44,7 @@ abstract class Key[+T <: ReplicatedData](val id: Key.KeyId) extends Serializable
     UnspecificKey(newId)
 
   override final def equals(o: Any): Boolean = o match {
-    case k: Key[_] => id == k.id
+    case k: Key[?] => id == k.id
     case _         => false
   }
 
diff --git a/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/LWWMap.scala b/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/LWWMap.scala
index 8d029ec2f6..b95439beab 100644
--- a/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/LWWMap.scala
+++ b/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/LWWMap.scala
@@ -174,7 +174,7 @@ final class LWWMap[A, B] private[pekko] (private[pekko] val underlying: ORMap[A,
   override def toString: String = s"LWW$entries" // e.g. LWWMap(a -> 1, b -> 2)
 
   override def equals(o: Any): Boolean = o match {
-    case other: LWWMap[_, _] => underlying == other.underlying
+    case other: LWWMap[?, ?] => underlying == other.underlying
     case _                   => false
   }
 
diff --git a/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/LWWRegister.scala b/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/LWWRegister.scala
index 9224591d4f..d9f4b341ae 100644
--- a/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/LWWRegister.scala
+++ b/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/LWWRegister.scala
@@ -182,7 +182,7 @@ final class LWWRegister[A] private[pekko] (private[pekko] val node: UniqueAddres
   override def toString: String = s"LWWRegister($value)"
 
   override def equals(o: Any): Boolean = o match {
-    case other: LWWRegister[_] =>
+    case other: LWWRegister[?] =>
       timestamp == other.timestamp && value == other.value && node == other.node
     case _ => false
   }
diff --git a/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/ORMap.scala b/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/ORMap.scala
index 1070ee3e63..db9a5e4499 100644
--- a/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/ORMap.scala
+++ b/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/ORMap.scala
@@ -69,7 +69,7 @@ object ORMap {
     def zeroTag: ZeroTag
     override def zero: DeltaReplicatedData = zeroTag.zero
     override def merge(that: DeltaOp): DeltaOp = that match {
-      case other: AtomicDeltaOp[_, _] => DeltaGroup(Vector(this, other))
+      case other: AtomicDeltaOp[?, ?] => DeltaGroup(Vector(this, other))
       case DeltaGroup(ops)            => DeltaGroup(this +: ops)
     }
     override def deltaSize: Int = 1
@@ -83,9 +83,9 @@ object ORMap {
       zeroTag: ZeroTag)
       extends AtomicDeltaOp[A, B] {
     override def merge(that: DeltaOp): DeltaOp = that match {
-      case put: PutDeltaOp[_, _] if this.value._1 == put.value._1 =>
+      case put: PutDeltaOp[?, ?] if this.value._1 == put.value._1 =>
         new PutDeltaOp[A, B](this.underlying.merge(put.underlying), put.asInstanceOf[PutDeltaOp[A, B]].value, zeroTag)
-      case update: UpdateDeltaOp[_, _]
+      case update: UpdateDeltaOp[?, ?]
           if update.values.size == 1 && update.asInstanceOf[UpdateDeltaOp[A, B]].values.contains(this.value._1) =>
         val (key, elem1) = this.value
         val newValue = elem1 match {
@@ -97,7 +97,7 @@ object ORMap {
             (key, elem1.merge(elem2).asInstanceOf[B])
         }
         new PutDeltaOp[A, B](this.underlying.merge(update.underlying), newValue, zeroTag)
-      case other: AtomicDeltaOp[_, _] => DeltaGroup(Vector(this, other))
+      case other: AtomicDeltaOp[?, ?] => DeltaGroup(Vector(this, other))
       case DeltaGroup(ops)            => DeltaGroup(this +: ops)
     }
   }
@@ -110,7 +110,7 @@ object ORMap {
       zeroTag: ZeroTag)
       extends AtomicDeltaOp[A, B] {
     override def merge(that: DeltaOp): DeltaOp = that match {
-      case update: UpdateDeltaOp[_, _] =>
+      case update: UpdateDeltaOp[?, ?] =>
         new UpdateDeltaOp[A, B](
           this.underlying.merge(update.underlying),
           update.asInstanceOf[UpdateDeltaOp[A, B]].values.foldLeft(this.values) { (map, pair) =>
@@ -122,10 +122,10 @@ object ORMap {
             } else map + pair
           },
           zeroTag)
-      case put: PutDeltaOp[_, _]
+      case put: PutDeltaOp[?, ?]
           if this.values.size == 1 && this.values.contains(put.asInstanceOf[PutDeltaOp[A, B]].value._1) =>
         new PutDeltaOp[A, B](this.underlying.merge(put.underlying), put.asInstanceOf[PutDeltaOp[A, B]].value, zeroTag)
-      case other: AtomicDeltaOp[_, _] => DeltaGroup(Vector(this, other))
+      case other: AtomicDeltaOp[?, ?] => DeltaGroup(Vector(this, other))
       case DeltaGroup(ops)            => DeltaGroup(this +: ops)
     }
   }
@@ -151,18 +151,18 @@ object ORMap {
       extends DeltaOp
       with ReplicatedDeltaSize {
     override def merge(that: DeltaOp): DeltaOp = that match {
-      case that: AtomicDeltaOp[_, _] =>
+      case that: AtomicDeltaOp[?, ?] =>
         ops.last match {
-          case thisPut: PutDeltaOp[_, _] =>
+          case thisPut: PutDeltaOp[?, ?] =>
             val merged = thisPut.merge(that)
             merged match {
-              case op: AtomicDeltaOp[_, _] => DeltaGroup(ops.dropRight(1) :+ op)
+              case op: AtomicDeltaOp[?, ?] => DeltaGroup(ops.dropRight(1) :+ op)
               case DeltaGroup(thatOps)     => DeltaGroup(ops.dropRight(1) ++ thatOps)
             }
-          case thisUpdate: UpdateDeltaOp[_, _] =>
+          case thisUpdate: UpdateDeltaOp[?, ?] =>
             val merged = thisUpdate.merge(that)
             merged match {
-              case op: AtomicDeltaOp[_, _] => DeltaGroup(ops.dropRight(1) :+ op)
+              case op: AtomicDeltaOp[?, ?] => DeltaGroup(ops.dropRight(1) :+ op)
               case DeltaGroup(thatOps)     => DeltaGroup(ops.dropRight(1) ++ thatOps)
             }
           case _ => DeltaGroup(ops :+ that)
@@ -256,7 +256,7 @@ final class ORMap[A, B <: ReplicatedData] private[pekko] (
    * INTERNAL API
    */
   @InternalApi private[pekko] def put(node: UniqueAddress, key: A, value: B): ORMap[A, B] =
-    if (value.isInstanceOf[ORSet[_]] && values.contains(key))
+    if (value.isInstanceOf[ORSet[?]] && values.contains(key))
       throw new IllegalArgumentException(
         "`ORMap.put` must not be used to replace an existing `ORSet` " +
         "value, because important history can be lost when replacing the `ORSet` and " +
@@ -415,24 +415,24 @@ final class ORMap[A, B <: ReplicatedData] private[pekko] (
     }
 
     val processDelta: PartialFunction[ORMap.DeltaOp, Unit] = {
-      case putOp: PutDeltaOp[_, _] =>
+      case putOp: PutDeltaOp[?, ?] =>
         val keyDelta = putOp.underlying
         mergedKeys = mergedKeys.mergeDelta(keyDelta)
         mergedValues = mergedValues +
           putOp
             .asInstanceOf[PutDeltaOp[A, B]]
             .value // put is destructive and propagates only full values of B!
-      case removeOp: RemoveDeltaOp[_, _] =>
+      case removeOp: RemoveDeltaOp[?, ?] =>
         val removedKey = removeOp.underlying match {
           // if op is RemoveDeltaOp then it must have exactly one element in the elements
-          case op: ORSet.RemoveDeltaOp[_] => op.underlying.elements.head.asInstanceOf[A]
+          case op: ORSet.RemoveDeltaOp[?] => op.underlying.elements.head.asInstanceOf[A]
           case _                          => throw new IllegalArgumentException("ORMap.RemoveDeltaOp must contain ORSet.RemoveDeltaOp inside")
         }
         mergedValues = mergedValues - removedKey
         mergedKeys = mergedKeys.mergeDelta(removeOp.underlying)
       // please note that if RemoveDeltaOp is not preceded by update clearing the value
       // anomalies may result
-      case removeKeyOp: RemoveKeyDeltaOp[_, _] =>
+      case removeKeyOp: RemoveKeyDeltaOp[?, ?] =>
         // removeKeyOp tombstones values for later use
         if (mergedValues.contains(removeKeyOp.asInstanceOf[RemoveKeyDeltaOp[A, B]].removedKey)) {
           tombstonedVals = tombstonedVals +
@@ -442,7 +442,7 @@ final class ORMap[A, B <: ReplicatedData] private[pekko] (
         }
         mergedValues = mergedValues - removeKeyOp.asInstanceOf[RemoveKeyDeltaOp[A, B]].removedKey
         mergedKeys = mergedKeys.mergeDelta(removeKeyOp.underlying)
-      case updateOp: UpdateDeltaOp[_, _] =>
+      case updateOp: UpdateDeltaOp[?, ?] =>
         mergedKeys = mergedKeys.mergeDelta(updateOp.underlying)
         updateOp.asInstanceOf[UpdateDeltaOp[A, B]].values.foreach {
           case (key, value) =>
@@ -542,7 +542,7 @@ final class ORMap[A, B <: ReplicatedData] private[pekko] (
   override def toString: String = s"OR$entries"
 
   override def equals(o: Any): Boolean = o match {
-    case other: ORMap[_, _] => keys == other.keys && values == other.values
+    case other: ORMap[?, ?] => keys == other.keys && values == other.values
     case _                  => false
   }
 
diff --git a/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/ORMultiMap.scala b/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/ORMultiMap.scala
index a582d84d3e..9068ee4249 100644
--- a/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/ORMultiMap.scala
+++ b/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/ORMultiMap.scala
@@ -316,7 +316,7 @@ final class ORMultiMap[A, B] private[pekko] (
   override def toString: String = s"ORMulti$entries"
 
   override def equals(o: Any): Boolean = o match {
-    case other: ORMultiMap[_, _] => underlying == other.underlying
+    case other: ORMultiMap[?, ?] => underlying == other.underlying
     case _                       => false
   }
 
diff --git a/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/ORSet.scala b/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/ORSet.scala
index 59212fa6a0..37510f7267 100644
--- a/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/ORSet.scala
+++ b/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/ORSet.scala
@@ -89,7 +89,7 @@ object ORSet {
         // Note that we only merge deltas originating from the same node
         AddDeltaOp(
           new ORSet(concatElementsMap(u.elementsMap.asInstanceOf[Map[A, Dot]]), underlying.vvector.merge(u.vvector)))
-      case _: AtomicDeltaOp[_] => DeltaGroup(Vector(this, that))
+      case _: AtomicDeltaOp[?] => DeltaGroup(Vector(this, that))
       case DeltaGroup(ops)     => DeltaGroup(this +: ops)
     }
 
@@ -108,7 +108,7 @@ object ORSet {
       throw new IllegalArgumentException(s"RemoveDeltaOp should contain one removed element, but was $underlying")
 
     override def merge(that: DeltaOp): DeltaOp = that match {
-      case _: AtomicDeltaOp[_] => DeltaGroup(Vector(this, that)) // keep it simple for removals
+      case _: AtomicDeltaOp[?] => DeltaGroup(Vector(this, that)) // keep it simple for removals
       case DeltaGroup(ops)     => DeltaGroup(this +: ops)
     }
   }
@@ -116,7 +116,7 @@ object ORSet {
   /** INTERNAL API: Used for `clear` but could be used for other cases also */
   @InternalApi private[pekko] final case class FullStateDeltaOp[A](underlying: ORSet[A]) extends AtomicDeltaOp[A] {
     override def merge(that: DeltaOp): DeltaOp = that match {
-      case _: AtomicDeltaOp[_] => DeltaGroup(Vector(this, that))
+      case _: AtomicDeltaOp[?] => DeltaGroup(Vector(this, that))
       case DeltaGroup(ops)     => DeltaGroup(this +: ops)
     }
   }
@@ -128,10 +128,10 @@ object ORSet {
       extends DeltaOp
       with ReplicatedDeltaSize {
     override def merge(that: DeltaOp): DeltaOp = that match {
-      case thatAdd: AddDeltaOp[_] =>
+      case thatAdd: AddDeltaOp[?] =>
         // merge AddDeltaOp into last AddDeltaOp in the group, if possible
         ops.last match {
-          case thisAdd: AddDeltaOp[_] => DeltaGroup(ops.dropRight(1) :+ thisAdd.merge(thatAdd))
+          case thisAdd: AddDeltaOp[?] => DeltaGroup(ops.dropRight(1) :+ thisAdd.merge(thatAdd))
           case _                      => DeltaGroup(ops :+ thatAdd)
         }
       case DeltaGroup(thatOps) => DeltaGroup(ops ++ thatOps)
@@ -363,7 +363,7 @@ final class ORSet[A] private[pekko] (
     val newDelta = delta match {
       case None =>
         ORSet.AddDeltaOp(new ORSet(Map(element -> newDot), newDot))
-      case Some(existing: ORSet.AddDeltaOp[_]) =>
+      case Some(existing: ORSet.AddDeltaOp[?]) =>
         existing.merge(ORSet.AddDeltaOp(new ORSet(Map(element -> newDot), newDot)))
       case Some(d) =>
         d.merge(ORSet.AddDeltaOp(new ORSet(Map(element -> newDot), newDot)))
@@ -461,18 +461,18 @@ final class ORSet[A] private[pekko] (
 
   override def mergeDelta(thatDelta: ORSet.DeltaOp): ORSet[A] = {
     thatDelta match {
-      case d: ORSet.AddDeltaOp[_]       => dryMerge(d.asInstanceOf[ORSet.AddDeltaOp[A]].underlying, addDeltaOp = true)
-      case d: ORSet.RemoveDeltaOp[_]    => mergeRemoveDelta(d.asInstanceOf[ORSet.RemoveDeltaOp[A]])
-      case d: ORSet.FullStateDeltaOp[_] =>
+      case d: ORSet.AddDeltaOp[?]       => dryMerge(d.asInstanceOf[ORSet.AddDeltaOp[A]].underlying, addDeltaOp = true)
+      case d: ORSet.RemoveDeltaOp[?]    => mergeRemoveDelta(d.asInstanceOf[ORSet.RemoveDeltaOp[A]])
+      case d: ORSet.FullStateDeltaOp[?] =>
         dryMerge(d.asInstanceOf[ORSet.FullStateDeltaOp[A]].underlying, addDeltaOp = false)
       case ORSet.DeltaGroup(ops) =>
         ops.foldLeft(this) {
-          case (acc, op: ORSet.AddDeltaOp[_]) =>
+          case (acc, op: ORSet.AddDeltaOp[?]) =>
             acc.dryMerge(op.asInstanceOf[ORSet.AddDeltaOp[A]].underlying, addDeltaOp = true)
-          case (acc, op: ORSet.RemoveDeltaOp[_])    => acc.mergeRemoveDelta(op.asInstanceOf[ORSet.RemoveDeltaOp[A]])
-          case (acc, op: ORSet.FullStateDeltaOp[_]) =>
+          case (acc, op: ORSet.RemoveDeltaOp[?])    => acc.mergeRemoveDelta(op.asInstanceOf[ORSet.RemoveDeltaOp[A]])
+          case (acc, op: ORSet.FullStateDeltaOp[?]) =>
             acc.dryMerge(op.asInstanceOf[ORSet.FullStateDeltaOp[A]].underlying, addDeltaOp = false)
-          case (_, _: ORSet.DeltaGroup[_]) =>
+          case (_, _: ORSet.DeltaGroup[?]) =>
             throw new IllegalArgumentException("ORSet.DeltaGroup should not be nested")
         }
     }
@@ -557,7 +557,7 @@ final class ORSet[A] private[pekko] (
   override def toString: String = s"OR$elements"
 
   override def equals(o: Any): Boolean = o match {
-    case other: ORSet[_] => vvector == other.vvector && elementsMap == other.elementsMap
+    case other: ORSet[?] => vvector == other.vvector && elementsMap == other.elementsMap
     case _               => false
   }
 
diff --git a/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/PNCounterMap.scala b/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/PNCounterMap.scala
index 56d96bf0f9..7293264cea 100644
--- a/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/PNCounterMap.scala
+++ b/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/PNCounterMap.scala
@@ -176,7 +176,7 @@ final class PNCounterMap[A] private[pekko] (private[pekko] val underlying: ORMap
   override def toString: String = s"PNCounter$entries"
 
   override def equals(o: Any): Boolean = o match {
-    case other: PNCounterMap[_] => underlying == other.underlying
+    case other: PNCounterMap[?] => underlying == other.underlying
     case _                      => false
   }
 
diff --git a/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/Replicator.scala b/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/Replicator.scala
index 45f910393d..f9f3f996da 100644
--- a/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/Replicator.scala
+++ b/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/Replicator.scala
@@ -2764,10 +2764,10 @@ final class Replicator(settings: ReplicatorSettings) extends Actor with ActorLog
       // Try again with the full state
       sender() ! writeMsg
 
-    case _: Replicator.UpdateSuccess[_] =>
+    case _: Replicator.UpdateSuccess[?] =>
       gotLocalStoreReply = true
       if (isDone) reply(isTimeout = false)
-    case _: Replicator.StoreFailure[_] =>
+    case _: Replicator.StoreFailure[?] =>
       gotLocalStoreReply = true
       gotWriteNackFrom += selfUniqueAddress.address
       if (isDone) reply(isTimeout = false)
diff --git a/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/protobuf/ReplicatedDataSerializer.scala b/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/protobuf/ReplicatedDataSerializer.scala
index 6496dab09f..39619435ed 100644
--- a/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/protobuf/ReplicatedDataSerializer.scala
+++ b/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/protobuf/ReplicatedDataSerializer.scala
@@ -341,68 +341,68 @@ class ReplicatedDataSerializer(val system: ExtendedActorSystem)
     UnspecificKeyManifest -> (bytes => Key.UnspecificKey(keyIdFromBinary(bytes))))
 
   override def manifest(obj: AnyRef): String = obj match {
-    case _: ORSet[_]                     => ORSetManifest
-    case _: ORSet.AddDeltaOp[_]          => ORSetAddManifest
-    case _: ORSet.RemoveDeltaOp[_]       => ORSetRemoveManifest
-    case _: GSet[_]                      => GSetManifest
+    case _: ORSet[?]                     => ORSetManifest
+    case _: ORSet.AddDeltaOp[?]          => ORSetAddManifest
+    case _: ORSet.RemoveDeltaOp[?]       => ORSetRemoveManifest
+    case _: GSet[?]                      => GSetManifest
     case _: GCounter                     => GCounterManifest
     case _: PNCounter                    => PNCounterManifest
     case _: Flag                         => FlagManifest
-    case _: LWWRegister[_]               => LWWRegisterManifest
-    case _: ORMap[_, _]                  => ORMapManifest
-    case _: ORMap.PutDeltaOp[_, _]       => ORMapPutManifest
-    case _: ORMap.RemoveDeltaOp[_, _]    => ORMapRemoveManifest
-    case _: ORMap.RemoveKeyDeltaOp[_, _] => ORMapRemoveKeyManifest
-    case _: ORMap.UpdateDeltaOp[_, _]    => ORMapUpdateManifest
-    case _: LWWMap[_, _]                 => LWWMapManifest
-    case _: PNCounterMap[_]              => PNCounterMapManifest
-    case _: ORMultiMap[_, _]             => ORMultiMapManifest
+    case _: LWWRegister[?]               => LWWRegisterManifest
+    case _: ORMap[?, ?]                  => ORMapManifest
+    case _: ORMap.PutDeltaOp[?, ?]       => ORMapPutManifest
+    case _: ORMap.RemoveDeltaOp[?, ?]    => ORMapRemoveManifest
+    case _: ORMap.RemoveKeyDeltaOp[?, ?] => ORMapRemoveKeyManifest
+    case _: ORMap.UpdateDeltaOp[?, ?]    => ORMapUpdateManifest
+    case _: LWWMap[?, ?]                 => LWWMapManifest
+    case _: PNCounterMap[?]              => PNCounterMapManifest
+    case _: ORMultiMap[?, ?]             => ORMultiMapManifest
     case DeletedData                     => DeletedDataManifest
     case _: VersionVector                => VersionVectorManifest
 
-    case _: ORSetKey[_]         => ORSetKeyManifest
-    case _: GSetKey[_]          => GSetKeyManifest
+    case _: ORSetKey[?]         => ORSetKeyManifest
+    case _: GSetKey[?]          => GSetKeyManifest
     case _: GCounterKey         => GCounterKeyManifest
     case _: PNCounterKey        => PNCounterKeyManifest
     case _: FlagKey             => FlagKeyManifest
-    case _: LWWRegisterKey[_]   => LWWRegisterKeyManifest
-    case _: ORMapKey[_, _]      => ORMapKeyManifest
-    case _: LWWMapKey[_, _]     => LWWMapKeyManifest
-    case _: PNCounterMapKey[_]  => PNCounterMapKeyManifest
-    case _: ORMultiMapKey[_, _] => ORMultiMapKeyManifest
+    case _: LWWRegisterKey[?]   => LWWRegisterKeyManifest
+    case _: ORMapKey[?, ?]      => ORMapKeyManifest
+    case _: LWWMapKey[?, ?]     => LWWMapKeyManifest
+    case _: PNCounterMapKey[?]  => PNCounterMapKeyManifest
+    case _: ORMultiMapKey[?, ?] => ORMultiMapKeyManifest
     case _: Key.UnspecificKey   => UnspecificKeyManifest
 
-    case _: ORSet.DeltaGroup[_]       => ORSetDeltaGroupManifest
-    case _: ORMap.DeltaGroup[_, _]    => ORMapDeltaGroupManifest
-    case _: ORSet.FullStateDeltaOp[_] => ORSetFullManifest
+    case _: ORSet.DeltaGroup[?]       => ORSetDeltaGroupManifest
+    case _: ORMap.DeltaGroup[?, ?]    => ORMapDeltaGroupManifest
+    case _: ORSet.FullStateDeltaOp[?] => ORSetFullManifest
 
     case _ =>
       throw new IllegalArgumentException(s"Can't serialize object of type ${obj.getClass} in [${getClass.getName}]")
   }
 
   def toBinary(obj: AnyRef): Array[Byte] = obj match {
-    case m: ORSet[_]                     => compress(orsetToProto(m))
-    case m: ORSet.AddDeltaOp[_]          => orsetToProto(m.underlying).toByteArray
-    case m: ORSet.RemoveDeltaOp[_]       => orsetToProto(m.underlying).toByteArray
-    case m: GSet[_]                      => gsetToProto(m).toByteArray
+    case m: ORSet[?]                     => compress(orsetToProto(m))
+    case m: ORSet.AddDeltaOp[?]          => orsetToProto(m.underlying).toByteArray
+    case m: ORSet.RemoveDeltaOp[?]       => orsetToProto(m.underlying).toByteArray
+    case m: GSet[?]                      => gsetToProto(m).toByteArray
     case m: GCounter                     => gcounterToProto(m).toByteArray
     case m: PNCounter                    => pncounterToProto(m).toByteArray
     case m: Flag                         => flagToProto(m).toByteArray
-    case m: LWWRegister[_]               => lwwRegisterToProto(m).toByteArray
-    case m: ORMap[_, _]                  => compress(ormapToProto(m))
-    case m: ORMap.PutDeltaOp[_, _]       => ormapPutToProto(m).toByteArray
-    case m: ORMap.RemoveDeltaOp[_, _]    => ormapRemoveToProto(m).toByteArray
-    case m: ORMap.RemoveKeyDeltaOp[_, _] => ormapRemoveKeyToProto(m).toByteArray
-    case m: ORMap.UpdateDeltaOp[_, _]    => ormapUpdateToProto(m).toByteArray
-    case m: LWWMap[_, _]                 => compress(lwwmapToProto(m))
-    case m: PNCounterMap[_]              => compress(pncountermapToProto(m))
-    case m: ORMultiMap[_, _]             => compress(multimapToProto(m))
+    case m: LWWRegister[?]               => lwwRegisterToProto(m).toByteArray
+    case m: ORMap[?, ?]                  => compress(ormapToProto(m))
+    case m: ORMap.PutDeltaOp[?, ?]       => ormapPutToProto(m).toByteArray
+    case m: ORMap.RemoveDeltaOp[?, ?]    => ormapRemoveToProto(m).toByteArray
+    case m: ORMap.RemoveKeyDeltaOp[?, ?] => ormapRemoveKeyToProto(m).toByteArray
+    case m: ORMap.UpdateDeltaOp[?, ?]    => ormapUpdateToProto(m).toByteArray
+    case m: LWWMap[?, ?]                 => compress(lwwmapToProto(m))
+    case m: PNCounterMap[?]              => compress(pncountermapToProto(m))
+    case m: ORMultiMap[?, ?]             => compress(multimapToProto(m))
     case DeletedData                     => dm.Empty.getDefaultInstance.toByteArray
     case m: VersionVector                => versionVectorToProto(m).toByteArray
     case Key(id)                         => keyIdToBinary(id)
-    case m: ORSet.DeltaGroup[_]          => orsetDeltaGroupToProto(m).toByteArray
-    case m: ORMap.DeltaGroup[_, _]       => ormapDeltaGroupToProto(m).toByteArray
-    case m: ORSet.FullStateDeltaOp[_]    => orsetToProto(m.underlying).toByteArray
+    case m: ORSet.DeltaGroup[?]          => orsetDeltaGroupToProto(m).toByteArray
+    case m: ORMap.DeltaGroup[?, ?]       => ormapDeltaGroupToProto(m).toByteArray
+    case m: ORSet.FullStateDeltaOp[?]    => orsetToProto(m.underlying).toByteArray
     case _                               =>
       throw new IllegalArgumentException(s"Can't serialize object of type ${obj.getClass} in [${getClass.getName}]")
   }
@@ -415,7 +415,7 @@ class ReplicatedDataSerializer(val system: ExtendedActorSystem)
           s"Unimplemented deserialization of message with manifest [$manifest] in [${getClass.getName}]")
     }
 
-  def gsetToProto(gset: GSet[_]): rd.GSet = {
+  def gsetToProto(gset: GSet[?]): rd.GSet = {
     val b = rd.GSet.newBuilder()
     // using java collections and sorting for performance (avoid conversions)
     val stringElements = new ArrayList[String]
@@ -453,7 +453,7 @@ class ReplicatedDataSerializer(val system: ExtendedActorSystem)
     b.build()
   }
 
-  def gsetFromBinary(bytes: Array[Byte]): GSet[_] =
+  def gsetFromBinary(bytes: Array[Byte]): GSet[?] =
     gsetFromProto(rd.GSet.parseFrom(bytes))
 
   def gsetFromProto(gset: rd.GSet): GSet[Any] = {
@@ -467,7 +467,7 @@ class ReplicatedDataSerializer(val system: ExtendedActorSystem)
     GSet(elements.toSet)
   }
 
-  def orsetToProto(orset: ORSet[_]): rd.ORSet =
+  def orsetToProto(orset: ORSet[?]): rd.ORSet =
     orsetToProtoImpl(orset.asInstanceOf[ORSet[Any]])
 
   private def orsetToProtoImpl(orset: ORSet[Any]): rd.ORSet = {
@@ -491,7 +491,7 @@ class ReplicatedDataSerializer(val system: ExtendedActorSystem)
         otherElementsMap = otherElementsMap.updated(enclosedMsg, other)
     }
 
-    def addDots(elements: ArrayList[_]): Unit = {
+    def addDots(elements: ArrayList[?]): Unit = {
       // add corresponding dots in same order
       val iter = elements.iterator
       while (iter.hasNext) {
@@ -547,8 +547,8 @@ class ReplicatedDataSerializer(val system: ExtendedActorSystem)
   private def orsetFullFromBinary(bytes: Array[Byte]): ORSet.FullStateDeltaOp[Any] =
     new ORSet.FullStateDeltaOp(orsetFromProto(rd.ORSet.parseFrom(bytes)))
 
-  private def orsetDeltaGroupToProto(deltaGroup: ORSet.DeltaGroup[_]): rd.ORSetDeltaGroup = {
-    def createEntry(opType: rd.ORSetDeltaOp, u: ORSet[_]) = {
+  private def orsetDeltaGroupToProto(deltaGroup: ORSet.DeltaGroup[?]): rd.ORSetDeltaGroup = {
+    def createEntry(opType: rd.ORSetDeltaOp, u: ORSet[?]) = {
       rd.ORSetDeltaGroup.Entry.newBuilder().setOperation(opType).setUnderlying(orsetToProto(u))
     }
 
@@ -608,7 +608,7 @@ class ReplicatedDataSerializer(val system: ExtendedActorSystem)
   def flagFromProto(flag: rd.Flag): Flag =
     if (flag.getEnabled) Flag.Enabled else Flag.Disabled
 
-  def lwwRegisterToProto(lwwRegister: LWWRegister[_]): rd.LWWRegister =
+  def lwwRegisterToProto(lwwRegister: LWWRegister[?]): rd.LWWRegister =
     rd.LWWRegister
       .newBuilder()
       .setTimestamp(lwwRegister.timestamp)
@@ -687,7 +687,7 @@ class ReplicatedDataSerializer(val system: ExtendedActorSystem)
     protoEntries
   }
 
-  def ormapToProto(ormap: ORMap[_, _]): rd.ORMap = {
+  def ormapToProto(ormap: ORMap[?, ?]): rd.ORMap = {
     val ormapBuilder = rd.ORMap.newBuilder()
     val entries: jl.Iterable[rd.ORMap.Entry] =
       getEntries(ormap.values, rd.ORMap.Entry.newBuilder _, otherMessageToProto)
@@ -744,7 +744,7 @@ class ReplicatedDataSerializer(val system: ExtendedActorSystem)
   // wire protocol is always DeltaGroup
   private def ormapPutFromBinary(bytes: Array[Byte]): ORMap.PutDeltaOp[Any, ReplicatedData] = {
     val ops = ormapDeltaGroupOpsFromBinary(bytes)
-    if (ops.size == 1 && ops.head.isInstanceOf[ORMap.PutDeltaOp[_, _]])
+    if (ops.size == 1 && ops.head.isInstanceOf[ORMap.PutDeltaOp[?, ?]])
       ops.head.asInstanceOf[ORMap.PutDeltaOp[Any, ReplicatedData]]
     else
       throw new NotSerializableException("Improper ORMap delta put operation size or kind")
@@ -753,7 +753,7 @@ class ReplicatedDataSerializer(val system: ExtendedActorSystem)
   // wire protocol is always delta group
   private def ormapRemoveFromBinary(bytes: Array[Byte]): ORMap.RemoveDeltaOp[Any, ReplicatedData] = {
     val ops = ormapDeltaGroupOpsFromBinary(bytes)
-    if (ops.size == 1 && ops.head.isInstanceOf[ORMap.RemoveDeltaOp[_, _]])
+    if (ops.size == 1 && ops.head.isInstanceOf[ORMap.RemoveDeltaOp[?, ?]])
       ops.head.asInstanceOf[ORMap.RemoveDeltaOp[Any, ReplicatedData]]
     else
       throw new NotSerializableException("Improper ORMap delta remove operation size or kind")
@@ -762,7 +762,7 @@ class ReplicatedDataSerializer(val system: ExtendedActorSystem)
   // wire protocol is always delta group
   private def ormapRemoveKeyFromBinary(bytes: Array[Byte]): ORMap.RemoveKeyDeltaOp[Any, ReplicatedData] = {
     val ops = ormapDeltaGroupOpsFromBinary(bytes)
-    if (ops.size == 1 && ops.head.isInstanceOf[ORMap.RemoveKeyDeltaOp[_, _]])
+    if (ops.size == 1 && ops.head.isInstanceOf[ORMap.RemoveKeyDeltaOp[?, ?]])
       ops.head.asInstanceOf[ORMap.RemoveKeyDeltaOp[Any, ReplicatedData]]
     else
       throw new NotSerializableException("Improper ORMap delta remove key operation size or kind")
@@ -771,7 +771,7 @@ class ReplicatedDataSerializer(val system: ExtendedActorSystem)
   // wire protocol is always delta group
   private def ormapUpdateFromBinary(bytes: Array[Byte]): ORMap.UpdateDeltaOp[Any, ReplicatedDelta] = {
     val ops = ormapDeltaGroupOpsFromBinary(bytes)
-    if (ops.size == 1 && ops.head.isInstanceOf[ORMap.UpdateDeltaOp[_, _]])
+    if (ops.size == 1 && ops.head.isInstanceOf[ORMap.UpdateDeltaOp[?, ?]])
       ops.head.asInstanceOf[ORMap.UpdateDeltaOp[Any, ReplicatedDelta]]
     else
       throw new NotSerializableException("Improper ORMap delta update operation size or kind")
@@ -830,28 +830,28 @@ class ReplicatedDataSerializer(val system: ExtendedActorSystem)
     ops
   }
 
-  private def ormapPutToProto(deltaOp: ORMap.PutDeltaOp[_, _]): rd.ORMapDeltaGroup = {
+  private def ormapPutToProto(deltaOp: ORMap.PutDeltaOp[?, ?]): rd.ORMapDeltaGroup = {
     ormapDeltaGroupOpsToProto(immutable.IndexedSeq(deltaOp.asInstanceOf[ORMap.DeltaOp]))
   }
 
-  private def ormapRemoveToProto(deltaOp: ORMap.RemoveDeltaOp[_, _]): rd.ORMapDeltaGroup = {
+  private def ormapRemoveToProto(deltaOp: ORMap.RemoveDeltaOp[?, ?]): rd.ORMapDeltaGroup = {
     ormapDeltaGroupOpsToProto(immutable.IndexedSeq(deltaOp.asInstanceOf[ORMap.DeltaOp]))
   }
 
-  private def ormapRemoveKeyToProto(deltaOp: ORMap.RemoveKeyDeltaOp[_, _]): rd.ORMapDeltaGroup = {
+  private def ormapRemoveKeyToProto(deltaOp: ORMap.RemoveKeyDeltaOp[?, ?]): rd.ORMapDeltaGroup = {
     ormapDeltaGroupOpsToProto(immutable.IndexedSeq(deltaOp.asInstanceOf[ORMap.DeltaOp]))
   }
 
-  private def ormapUpdateToProto(deltaOp: ORMap.UpdateDeltaOp[_, _]): rd.ORMapDeltaGroup = {
+  private def ormapUpdateToProto(deltaOp: ORMap.UpdateDeltaOp[?, ?]): rd.ORMapDeltaGroup = {
     ormapDeltaGroupOpsToProto(immutable.IndexedSeq(deltaOp.asInstanceOf[ORMap.DeltaOp]))
   }
 
-  private def ormapDeltaGroupToProto(deltaGroup: ORMap.DeltaGroup[_, _]): rd.ORMapDeltaGroup = {
+  private def ormapDeltaGroupToProto(deltaGroup: ORMap.DeltaGroup[?, ?]): rd.ORMapDeltaGroup = {
     ormapDeltaGroupOpsToProto(deltaGroup.ops)
   }
 
   private def ormapDeltaGroupOpsToProto(deltaGroupOps: immutable.IndexedSeq[ORMap.DeltaOp]): rd.ORMapDeltaGroup = {
-    def createEntry(opType: rd.ORMapDeltaOp, u: ORSet[_], m: Map[_, _], zt: Int) = {
+    def createEntry(opType: rd.ORMapDeltaOp, u: ORSet[?], m: Map[?, ?], zt: Int) = {
       if (m.size > 1 && opType != rd.ORMapDeltaOp.ORMapUpdate)
         throw new IllegalArgumentException("Invalid size of ORMap delta map")
       else {
@@ -879,7 +879,7 @@ class ReplicatedDataSerializer(val system: ExtendedActorSystem)
       }
     }
 
-    def createEntryWithKey(opType: rd.ORMapDeltaOp, u: ORSet[_], k: Any, zt: Int) = {
+    def createEntryWithKey(opType: rd.ORMapDeltaOp, u: ORSet[?], k: Any, zt: Int) = {
       val entryDataBuilder = rd.ORMapDeltaGroup.MapEntry.newBuilder()
       k match {
         case key: String => entryDataBuilder.setStringKey(key)
@@ -897,31 +897,31 @@ class ReplicatedDataSerializer(val system: ExtendedActorSystem)
     deltaGroupOps.foreach {
       case ORMap.PutDeltaOp(op, pair, zt) =>
         b.addEntries(
-          createEntry(rd.ORMapDeltaOp.ORMapPut, op.asInstanceOf[ORSet.AddDeltaOp[_]].underlying, Map(pair), zt.value))
+          createEntry(rd.ORMapDeltaOp.ORMapPut, op.asInstanceOf[ORSet.AddDeltaOp[?]].underlying, Map(pair), zt.value))
       case ORMap.RemoveDeltaOp(op, zt) =>
         b.addEntries(
           createEntry(
             rd.ORMapDeltaOp.ORMapRemove,
-            op.asInstanceOf[ORSet.RemoveDeltaOp[_]].underlying,
+            op.asInstanceOf[ORSet.RemoveDeltaOp[?]].underlying,
             Map.empty,
             zt.value))
       case ORMap.RemoveKeyDeltaOp(op, k, zt) =>
         b.addEntries(
           createEntryWithKey(
             rd.ORMapDeltaOp.ORMapRemoveKey,
-            op.asInstanceOf[ORSet.RemoveDeltaOp[_]].underlying,
+            op.asInstanceOf[ORSet.RemoveDeltaOp[?]].underlying,
             k,
             zt.value))
       case ORMap.UpdateDeltaOp(op, m, zt) =>
         b.addEntries(
-          createEntry(rd.ORMapDeltaOp.ORMapUpdate, op.asInstanceOf[ORSet.AddDeltaOp[_]].underlying, m, zt.value))
+          createEntry(rd.ORMapDeltaOp.ORMapUpdate, op.asInstanceOf[ORSet.AddDeltaOp[?]].underlying, m, zt.value))
       case ORMap.DeltaGroup(_) =>
         throw new IllegalArgumentException("ORMap.DeltaGroup should not be nested")
     }
     b.build()
   }
 
-  def lwwmapToProto(lwwmap: LWWMap[_, _]): rd.LWWMap = {
+  def lwwmapToProto(lwwmap: LWWMap[?, ?]): rd.LWWMap = {
     val lwwmapBuilder = rd.LWWMap.newBuilder()
     val entries: jl.Iterable[rd.LWWMap.Entry] =
       getEntries(lwwmap.underlying.entries, rd.LWWMap.Entry.newBuilder _, lwwRegisterToProto)
@@ -936,22 +936,22 @@ class ReplicatedDataSerializer(val system: ExtendedActorSystem)
     new LWWMap(new ORMap(keys = orsetFromProto(lwwmap.getKeys), entries, LWWMap.LWWMapTag))
   }
 
-  def pncountermapToProto(pncountermap: PNCounterMap[_]): rd.PNCounterMap = {
+  def pncountermapToProto(pncountermap: PNCounterMap[?]): rd.PNCounterMap = {
     val pncountermapBuilder = rd.PNCounterMap.newBuilder()
     val entries: jl.Iterable[rd.PNCounterMap.Entry] =
       getEntries(pncountermap.underlying.entries, rd.PNCounterMap.Entry.newBuilder _, pncounterToProto)
     pncountermapBuilder.setKeys(orsetToProto(pncountermap.underlying.keys)).addAllEntries(entries).build()
   }
 
-  def pncountermapFromBinary(bytes: Array[Byte]): PNCounterMap[_] =
+  def pncountermapFromBinary(bytes: Array[Byte]): PNCounterMap[?] =
     pncountermapFromProto(rd.PNCounterMap.parseFrom(decompress(bytes)))
 
-  def pncountermapFromProto(pncountermap: rd.PNCounterMap): PNCounterMap[_] = {
+  def pncountermapFromProto(pncountermap: rd.PNCounterMap): PNCounterMap[?] = {
     val entries = mapTypeFromProto(pncountermap.getEntriesList, pncounterFromProto)
     new PNCounterMap(new ORMap(keys = orsetFromProto(pncountermap.getKeys), entries, PNCounterMap.PNCounterMapTag))
   }
 
-  def multimapToProto(multimap: ORMultiMap[_, _]): rd.ORMultiMap = {
+  def multimapToProto(multimap: ORMultiMap[?, ?]): rd.ORMultiMap = {
     val ormultimapBuilder = rd.ORMultiMap.newBuilder()
     val entries: jl.Iterable[rd.ORMultiMap.Entry] =
       getEntries(multimap.underlying.entries, rd.ORMultiMap.Entry.newBuilder _, orsetToProto)
diff --git a/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/protobuf/ReplicatorMessageSerializer.scala b/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/protobuf/ReplicatorMessageSerializer.scala
index bb45747aca..0840b6ad0b 100644
--- a/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/protobuf/ReplicatorMessageSerializer.scala
+++ b/distributed-data/src/main/scala/org/apache/pekko/cluster/ddata/protobuf/ReplicatorMessageSerializer.scala
@@ -224,14 +224,14 @@ class ReplicatorMessageSerializer(val system: ExtendedActorSystem)
     case _: ReadResult          => ReadResultManifest
     case _: DeltaPropagation    => DeltaPropagationManifest
     case _: Status              => StatusManifest
-    case _: Get[_]              => GetManifest
-    case _: GetSuccess[_]       => GetSuccessManifest
+    case _: Get[?]              => GetManifest
+    case _: GetSuccess[?]       => GetSuccessManifest
     case _: DurableDataEnvelope => DurableDataEnvelopeManifest
-    case _: Changed[_]          => ChangedManifest
-    case _: NotFound[_]         => NotFoundManifest
-    case _: GetFailure[_]       => GetFailureManifest
-    case _: Subscribe[_]        => SubscribeManifest
-    case _: Unsubscribe[_]      => UnsubscribeManifest
+    case _: Changed[?]          => ChangedManifest
+    case _: NotFound[?]         => NotFoundManifest
+    case _: GetFailure[?]       => GetFailureManifest
+    case _: Subscribe[?]        => SubscribeManifest
+    case _: Unsubscribe[?]      => UnsubscribeManifest
     case _: Gossip              => GossipManifest
     case WriteNack              => WriteNackManifest
     case DeltaNack              => DeltaNackManifest
@@ -247,14 +247,14 @@ class ReplicatorMessageSerializer(val system: ExtendedActorSystem)
     case m: ReadResult          => readResultToProto(m).toByteArray
     case m: Status              => statusToProto(m).toByteArray
     case m: DeltaPropagation    => deltaPropagationToProto(m).toByteArray
-    case m: Get[_]              => getToProto(m).toByteArray
-    case m: GetSuccess[_]       => getSuccessToProto(m).toByteArray
+    case m: Get[?]              => getToProto(m).toByteArray
+    case m: GetSuccess[?]       => getSuccessToProto(m).toByteArray
     case m: DurableDataEnvelope => durableDataEnvelopeToProto(m).toByteArray
-    case m: Changed[_]          => changedToProto(m).toByteArray
-    case m: NotFound[_]         => notFoundToProto(m).toByteArray
-    case m: GetFailure[_]       => getFailureToProto(m).toByteArray
-    case m: Subscribe[_]        => subscribeToProto(m).toByteArray
-    case m: Unsubscribe[_]      => unsubscribeToProto(m).toByteArray
+    case m: Changed[?]          => changedToProto(m).toByteArray
+    case m: NotFound[?]         => notFoundToProto(m).toByteArray
+    case m: GetFailure[?]       => getFailureToProto(m).toByteArray
+    case m: Subscribe[?]        => subscribeToProto(m).toByteArray
+    case m: Unsubscribe[?]      => unsubscribeToProto(m).toByteArray
     case m: Gossip              => compress(gossipToProto(m))
     case WriteNack              => dm.Empty.getDefaultInstance.toByteArray
     case DeltaNack              => dm.Empty.getDefaultInstance.toByteArray
@@ -362,7 +362,7 @@ class ReplicatorMessageSerializer(val system: ExtendedActorSystem)
       }.toMap)
   }
 
-  private def getToProto(get: Get[_]): dm.Get = {
+  private def getToProto(get: Get[?]): dm.Get = {
     val timoutInMillis = get.consistency.timeout.toMillis
     require(timoutInMillis <= 0xFFFFFFFFL, "Timeouts must fit in a 32-bit unsigned int")
 
@@ -389,7 +389,7 @@ class ReplicatorMessageSerializer(val system: ExtendedActorSystem)
     b.build()
   }
 
-  private def getFromBinary(bytes: Array[Byte]): Get[_] = {
+  private def getFromBinary(bytes: Array[Byte]): Get[?] = {
     val get = dm.Get.parseFrom(bytes)
     val key = otherMessageFromProto(get.getKey).asInstanceOf[KeyR]
     val request = if (get.hasRequest()) Some(otherMessageFromProto(get.getRequest)) else None
@@ -412,7 +412,7 @@ class ReplicatorMessageSerializer(val system: ExtendedActorSystem)
     Get(key, consistency, request)
   }
 
-  private def getSuccessToProto(getSuccess: GetSuccess[_]): dm.GetSuccess = {
+  private def getSuccessToProto(getSuccess: GetSuccess[?]): dm.GetSuccess = {
     val b = dm.GetSuccess
       .newBuilder()
       .setKey(otherMessageToProto(getSuccess.key))
@@ -422,7 +422,7 @@ class ReplicatorMessageSerializer(val system: ExtendedActorSystem)
     b.build()
   }
 
-  private def getSuccessFromBinary(bytes: Array[Byte]): GetSuccess[_] = {
+  private def getSuccessFromBinary(bytes: Array[Byte]): GetSuccess[?] = {
     val getSuccess = dm.GetSuccess.parseFrom(bytes)
     val key = otherMessageFromProto(getSuccess.getKey).asInstanceOf[KeyR]
     val request = if (getSuccess.hasRequest()) Some(otherMessageFromProto(getSuccess.getRequest)) else None
@@ -430,66 +430,66 @@ class ReplicatorMessageSerializer(val system: ExtendedActorSystem)
     GetSuccess(key, request)(data)
   }
 
-  private def notFoundToProto(notFound: NotFound[_]): dm.NotFound = {
+  private def notFoundToProto(notFound: NotFound[?]): dm.NotFound = {
     val b = dm.NotFound.newBuilder().setKey(otherMessageToProto(notFound.key))
     notFound.request.foreach(o => b.setRequest(otherMessageToProto(o)))
     b.build()
   }
 
-  private def notFoundFromBinary(bytes: Array[Byte]): NotFound[_] = {
+  private def notFoundFromBinary(bytes: Array[Byte]): NotFound[?] = {
     val notFound = dm.NotFound.parseFrom(bytes)
     val request = if (notFound.hasRequest()) Some(otherMessageFromProto(notFound.getRequest)) else None
     val key = otherMessageFromProto(notFound.getKey).asInstanceOf[KeyR]
     NotFound(key, request)
   }
 
-  private def getFailureToProto(getFailure: GetFailure[_]): dm.GetFailure = {
+  private def getFailureToProto(getFailure: GetFailure[?]): dm.GetFailure = {
     val b = dm.GetFailure.newBuilder().setKey(otherMessageToProto(getFailure.key))
     getFailure.request.foreach(o => b.setRequest(otherMessageToProto(o)))
     b.build()
   }
 
-  private def getFailureFromBinary(bytes: Array[Byte]): GetFailure[_] = {
+  private def getFailureFromBinary(bytes: Array[Byte]): GetFailure[?] = {
     val getFailure = dm.GetFailure.parseFrom(bytes)
     val request = if (getFailure.hasRequest()) Some(otherMessageFromProto(getFailure.getRequest)) else None
     val key = otherMessageFromProto(getFailure.getKey).asInstanceOf[KeyR]
     GetFailure(key, request)
   }
 
-  private def subscribeToProto(subscribe: Subscribe[_]): dm.Subscribe =
+  private def subscribeToProto(subscribe: Subscribe[?]): dm.Subscribe =
     dm.Subscribe
       .newBuilder()
       .setKey(otherMessageToProto(subscribe.key))
       .setRef(Serialization.serializedActorPath(subscribe.subscriber))
       .build()
 
-  private def subscribeFromBinary(bytes: Array[Byte]): Subscribe[_] = {
+  private def subscribeFromBinary(bytes: Array[Byte]): Subscribe[?] = {
     val subscribe = dm.Subscribe.parseFrom(bytes)
     val key = otherMessageFromProto(subscribe.getKey).asInstanceOf[KeyR]
     Subscribe(key, resolveActorRef(subscribe.getRef))
   }
 
-  private def unsubscribeToProto(unsubscribe: Unsubscribe[_]): dm.Unsubscribe =
+  private def unsubscribeToProto(unsubscribe: Unsubscribe[?]): dm.Unsubscribe =
     dm.Unsubscribe
       .newBuilder()
       .setKey(otherMessageToProto(unsubscribe.key))
       .setRef(Serialization.serializedActorPath(unsubscribe.subscriber))
       .build()
 
-  private def unsubscribeFromBinary(bytes: Array[Byte]): Unsubscribe[_] = {
+  private def unsubscribeFromBinary(bytes: Array[Byte]): Unsubscribe[?] = {
     val unsubscribe = dm.Unsubscribe.parseFrom(bytes)
     val key = otherMessageFromProto(unsubscribe.getKey).asInstanceOf[KeyR]
     Unsubscribe(key, resolveActorRef(unsubscribe.getRef))
   }
 
-  private def changedToProto(changed: Changed[_]): dm.Changed =
+  private def changedToProto(changed: Changed[?]): dm.Changed =
     dm.Changed
       .newBuilder()
       .setKey(otherMessageToProto(changed.key))
       .setData(otherMessageToProto(changed.dataValue))
       .build()
 
-  private def changedFromBinary(bytes: Array[Byte]): Changed[_] = {
+  private def changedFromBinary(bytes: Array[Byte]): Changed[?] = {
     val changed = dm.Changed.parseFrom(bytes)
     val data = otherMessageFromProto(changed.getData).asInstanceOf[ReplicatedData]
     val key = otherMessageFromProto(changed.getKey).asInstanceOf[KeyR]
diff --git a/distributed-data/src/multi-jvm/scala/org/apache/pekko/cluster/ddata/JepsenInspiredInsertSpec.scala b/distributed-data/src/multi-jvm/scala/org/apache/pekko/cluster/ddata/JepsenInspiredInsertSpec.scala
index 3d3e55bdd7..d2cd97926e 100644
--- a/distributed-data/src/multi-jvm/scala/org/apache/pekko/cluster/ddata/JepsenInspiredInsertSpec.scala
+++ b/distributed-data/src/multi-jvm/scala/org/apache/pekko/cluster/ddata/JepsenInspiredInsertSpec.scala
@@ -135,8 +135,8 @@ class JepsenInspiredInsertSpec
         replicator.tell(Update(key, ORSet(), WriteLocal, Some(i))(_ :+ i), writeProbe.ref)
         writeProbe.receiveOne(3.seconds)
       }
-      val successWriteAcks = writeAcks.collect { case success: UpdateSuccess[_] => success }
-      val failureWriteAcks = writeAcks.collect { case fail: UpdateFailure[_] => fail }
+      val successWriteAcks = writeAcks.collect { case success: UpdateSuccess[?] => success }
+      val failureWriteAcks = writeAcks.collect { case fail: UpdateFailure[?] => fail }
       successWriteAcks.map(_.request.get).toSet should be(myData.toSet)
       successWriteAcks.size should be(myData.size)
       failureWriteAcks should be(Nil)
@@ -168,8 +168,8 @@ class JepsenInspiredInsertSpec
         replicator.tell(Update(key, ORSet(), writeMajority, Some(i))(_ :+ i), writeProbe.ref)
         writeProbe.receiveOne(timeout + 1.second)
       }
-      val successWriteAcks = writeAcks.collect { case success: UpdateSuccess[_] => success }
-      val failureWriteAcks = writeAcks.collect { case fail: UpdateFailure[_] => fail }
+      val successWriteAcks = writeAcks.collect { case success: UpdateSuccess[?] => success }
+      val failureWriteAcks = writeAcks.collect { case fail: UpdateFailure[?] => fail }
       successWriteAcks.map(_.request.get).toSet should be(myData.toSet)
       successWriteAcks.size should be(myData.size)
       failureWriteAcks should be(Nil)
@@ -212,8 +212,8 @@ class JepsenInspiredInsertSpec
         replicator.tell(Update(key, ORSet(), WriteLocal, Some(i))(_ :+ i), writeProbe.ref)
         writeProbe.receiveOne(3.seconds)
       }
-      val successWriteAcks = writeAcks.collect { case success: UpdateSuccess[_] => success }
-      val failureWriteAcks = writeAcks.collect { case fail: UpdateFailure[_] => fail }
+      val successWriteAcks = writeAcks.collect { case success: UpdateSuccess[?] => success }
+      val failureWriteAcks = writeAcks.collect { case fail: UpdateFailure[?] => fail }
       successWriteAcks.map(_.request.get).toSet should be(myData.toSet)
       successWriteAcks.size should be(myData.size)
       failureWriteAcks should be(Nil)
@@ -257,8 +257,8 @@ class JepsenInspiredInsertSpec
         replicator.tell(Update(key, ORSet(), writeMajority, Some(i))(_ :+ i), writeProbe.ref)
         writeProbe.receiveOne(timeout + 1.second)
       }
-      val successWriteAcks = writeAcks.collect { case success: UpdateSuccess[_] => success }
-      val failureWriteAcks = writeAcks.collect { case fail: UpdateFailure[_] => fail }
+      val successWriteAcks = writeAcks.collect { case success: UpdateSuccess[?] => success }
+      val failureWriteAcks = writeAcks.collect { case fail: UpdateFailure[?] => fail }
       runOn(n1, n4, n5) {
         successWriteAcks.map(_.request.get).toSet should be(myData.toSet)
         successWriteAcks.size should be(myData.size)
diff --git a/distributed-data/src/multi-jvm/scala/org/apache/pekko/cluster/ddata/ReplicatorChaosSpec.scala b/distributed-data/src/multi-jvm/scala/org/apache/pekko/cluster/ddata/ReplicatorChaosSpec.scala
index cc0187e67a..64a5185c6c 100644
--- a/distributed-data/src/multi-jvm/scala/org/apache/pekko/cluster/ddata/ReplicatorChaosSpec.scala
+++ b/distributed-data/src/multi-jvm/scala/org/apache/pekko/cluster/ddata/ReplicatorChaosSpec.scala
@@ -85,8 +85,8 @@ class ReplicatorChaosSpec extends MultiNodeSpec(ReplicatorChaosSpec) with STMult
             g.dataValue match {
               case c: GCounter  => c.value
               case c: PNCounter => c.value
-              case c: GSet[_]   => c.elements
-              case c: ORSet[_]  => c.elements
+              case c: GSet[?]   => c.elements
+              case c: ORSet[?]  => c.elements
               case _            => fail()
             }
         }
@@ -125,7 +125,7 @@ class ReplicatorChaosSpec extends MultiNodeSpec(ReplicatorChaosSpec) with STMult
           replicator ! Update(KeyB, PNCounter(), WriteLocal)(_.decrement(1))
           replicator ! Update(KeyC, GCounter(), WriteAll(timeout))(_ :+ 1)
         }
-        receiveN(15).map(_.getClass).toSet should be(Set(classOf[UpdateSuccess[_]]))
+        receiveN(15).map(_.getClass).toSet should be(Set(classOf[UpdateSuccess[?]]))
       }
 
       runOn(second) {
diff --git a/distributed-data/src/multi-jvm/scala/org/apache/pekko/cluster/ddata/ReplicatorDeltaSpec.scala b/distributed-data/src/multi-jvm/scala/org/apache/pekko/cluster/ddata/ReplicatorDeltaSpec.scala
index fa8923857f..c488c38e80 100644
--- a/distributed-data/src/multi-jvm/scala/org/apache/pekko/cluster/ddata/ReplicatorDeltaSpec.scala
+++ b/distributed-data/src/multi-jvm/scala/org/apache/pekko/cluster/ddata/ReplicatorDeltaSpec.scala
@@ -251,8 +251,8 @@ class ReplicatorDeltaSpec extends MultiNodeSpec(ReplicatorDeltaSpec) with STMult
         val p1 = TestProbe()
         fullStateReplicator.tell(Update(KeyD, ORSet.empty[String], writeAll)(_ :+ "A"), p1.ref)
         deltaReplicator.tell(Update(KeyD, ORSet.empty[String], writeAll)(_ :+ "A"), p1.ref)
-        p1.expectMsgType[UpdateSuccess[_]]
-        p1.expectMsgType[UpdateSuccess[_]]
+        p1.expectMsgType[UpdateSuccess[?]]
+        p1.expectMsgType[UpdateSuccess[?]]
       }
       enterBarrier("write-1")
 
@@ -268,9 +268,9 @@ class ReplicatorDeltaSpec extends MultiNodeSpec(ReplicatorDeltaSpec) with STMult
         deltaReplicator.tell(Update(KeyD, ORSet.empty[String], writeAll)(_ :+ "B"), p1.ref)
         deltaReplicator.tell(Update(KeyD, ORSet.empty[String], writeAll)(_ :+ "C"), p1.ref)
         deltaReplicator.tell(Update(KeyD, ORSet.empty[String], writeAll)(_ :+ "D"), p1.ref)
-        p1.expectMsgType[UpdateSuccess[_]]
-        p1.expectMsgType[UpdateSuccess[_]]
-        p1.expectMsgType[UpdateSuccess[_]]
+        p1.expectMsgType[UpdateSuccess[?]]
+        p1.expectMsgType[UpdateSuccess[?]]
+        p1.expectMsgType[UpdateSuccess[?]]
       }
       enterBarrier("write-2")
       deltaReplicator.tell(Get(KeyD, ReadLocal), p.ref)
@@ -280,7 +280,7 @@ class ReplicatorDeltaSpec extends MultiNodeSpec(ReplicatorDeltaSpec) with STMult
       runOn(first) {
         val p1 = TestProbe()
         fullStateReplicator.tell(Update(KeyD, ORSet.empty[String], writeAll)(_ :+ "A" :+ "B" :+ "C" :+ "D"), p1.ref)
-        p1.expectMsgType[UpdateSuccess[_]]
+        p1.expectMsgType[UpdateSuccess[?]]
       }
       enterBarrier("write-3")
       fullStateReplicator.tell(Get(KeyD, ReadLocal), p.ref)
@@ -293,7 +293,7 @@ class ReplicatorDeltaSpec extends MultiNodeSpec(ReplicatorDeltaSpec) with STMult
       runOn(first) {
         val p1 = TestProbe()
         deltaReplicator.tell(Update(KeyHigh, Highest(0), WriteLocal)(_.incr(1)), p1.ref)
-        p1.expectMsgType[UpdateSuccess[_]]
+        p1.expectMsgType[UpdateSuccess[?]]
       }
       enterBarrier("write-1")
 
@@ -316,11 +316,11 @@ class ReplicatorDeltaSpec extends MultiNodeSpec(ReplicatorDeltaSpec) with STMult
       runOn(first) {
         val p1 = TestProbe()
         deltaReplicator.tell(Update(KeyHigh, Highest(0), writeAll)(_.incr(2)), p1.ref)
-        p1.expectMsgType[UpdateSuccess[_]]
+        p1.expectMsgType[UpdateSuccess[?]]
         deltaReplicator.tell(Update(KeyHigh, Highest(0), WriteLocal)(_.incrNoDelta(5)), p1.ref)
         deltaReplicator.tell(Update(KeyHigh, Highest(0), WriteLocal)(_.incr(10)), p1.ref)
-        p1.expectMsgType[UpdateSuccess[_]]
-        p1.expectMsgType[UpdateSuccess[_]]
+        p1.expectMsgType[UpdateSuccess[?]]
+        p1.expectMsgType[UpdateSuccess[?]]
       }
       enterBarrier("write-2")
 
@@ -347,7 +347,7 @@ class ReplicatorDeltaSpec extends MultiNodeSpec(ReplicatorDeltaSpec) with STMult
         // delta versions again. Same would happen via full state gossip.
         // Thereafter delta can be propagated and applied again.
         deltaReplicator.tell(Update(KeyHigh, Highest(0), writeAll)(_.incr(100)), p1.ref)
-        p1.expectMsgType[UpdateSuccess[_]]
+        p1.expectMsgType[UpdateSuccess[?]]
         // Flush the deltaPropagation buffer, otherwise it will contain
         // NoDeltaPlaceholder from previous updates and the incr(4) delta will also
         // be folded into NoDeltaPlaceholder and not propagated as delta. A few DeltaPropagationTick
@@ -356,7 +356,7 @@ class ReplicatorDeltaSpec extends MultiNodeSpec(ReplicatorDeltaSpec) with STMult
           deltaReplicator ! Replicator.Internal.DeltaPropagationTick
         }
         deltaReplicator.tell(Update(KeyHigh, Highest(0), WriteLocal)(_.incr(4)), p1.ref)
-        p1.expectMsgType[UpdateSuccess[_]]
+        p1.expectMsgType[UpdateSuccess[?]]
       }
       enterBarrier("write-3")
 
diff --git a/distributed-data/src/multi-jvm/scala/org/apache/pekko/cluster/ddata/ReplicatorGossipSpec.scala b/distributed-data/src/multi-jvm/scala/org/apache/pekko/cluster/ddata/ReplicatorGossipSpec.scala
index eaae981ace..50d4d88558 100644
--- a/distributed-data/src/multi-jvm/scala/org/apache/pekko/cluster/ddata/ReplicatorGossipSpec.scala
+++ b/distributed-data/src/multi-jvm/scala/org/apache/pekko/cluster/ddata/ReplicatorGossipSpec.scala
@@ -93,11 +93,11 @@ class ReplicatorGossipSpec extends MultiNodeSpec(ReplicatorGossipSpec) with STMu
       runOn(first) {
         (0 until numberOfSmall).foreach { i =>
           replicator ! Update(smallORSetKeys(i), ORSet.empty[String], WriteLocal)(_ :+ smallPayload())
-          expectMsgType[UpdateSuccess[_]]
+          expectMsgType[UpdateSuccess[?]]
         }
         (0 until numberOfLarge).foreach { i =>
           replicator ! Update(largeORSetKeys(i), ORSet.empty[String], WriteLocal)(_ :+ largePayload())
-          expectMsgType[UpdateSuccess[_]]
+          expectMsgType[UpdateSuccess[?]]
         }
       }
       enterBarrier("updated-first")
diff --git a/distributed-data/src/multi-jvm/scala/org/apache/pekko/cluster/ddata/ReplicatorORSetDeltaSpec.scala b/distributed-data/src/multi-jvm/scala/org/apache/pekko/cluster/ddata/ReplicatorORSetDeltaSpec.scala
index 2ad05a63d4..bdb7a59db2 100644
--- a/distributed-data/src/multi-jvm/scala/org/apache/pekko/cluster/ddata/ReplicatorORSetDeltaSpec.scala
+++ b/distributed-data/src/multi-jvm/scala/org/apache/pekko/cluster/ddata/ReplicatorORSetDeltaSpec.scala
@@ -76,7 +76,7 @@ class ReplicatorORSetDeltaSpec
         val value = expectMsgPF() {
           case g @ GetSuccess(`key`, _) =>
             g.dataValue match {
-              case c: ORSet[_] => c.elements
+              case c: ORSet[?] => c.elements
               case _           => fail()
             }
         }
diff --git a/distributed-data/src/multi-jvm/scala/org/apache/pekko/cluster/ddata/ReplicatorSpec.scala b/distributed-data/src/multi-jvm/scala/org/apache/pekko/cluster/ddata/ReplicatorSpec.scala
index aaba6a8533..d6dbb5b381 100644
--- a/distributed-data/src/multi-jvm/scala/org/apache/pekko/cluster/ddata/ReplicatorSpec.scala
+++ b/distributed-data/src/multi-jvm/scala/org/apache/pekko/cluster/ddata/ReplicatorSpec.scala
@@ -205,7 +205,7 @@ class ReplicatorSpec extends MultiNodeSpec(ReplicatorSpec) with STMultiNodeSpec
   "reply with ModifyFailure if exception is thrown by modify function" in {
     val e = new RuntimeException("errr")
     replicator ! Update(KeyA, GCounter(), WriteLocal)(_ => throw e)
-    expectMsgType[ModifyFailure[_]].cause should be(e)
+    expectMsgType[ModifyFailure[?]].cause should be(e)
   }
 
   "replicate values to new node" in {
@@ -459,7 +459,7 @@ class ReplicatorSpec extends MultiNodeSpec(ReplicatorSpec) with STMultiNodeSpec
       val probe1 = TestProbe()
       val probe2 = TestProbe()
       replicator.tell(Get(KeyE, readMajority), probe2.ref)
-      probe2.expectMsgType[GetSuccess[_]]
+      probe2.expectMsgType[GetSuccess[?]]
       replicator.tell(Update(KeyE, GCounter(), writeMajority, None) { data =>
           probe1.ref ! data.value
           data :+ 1
@@ -478,7 +478,7 @@ class ReplicatorSpec extends MultiNodeSpec(ReplicatorSpec) with STMultiNodeSpec
     runOn(second) {
       val probe1 = TestProbe()
       replicator.tell(Get(KeyE, readMajority), probe1.ref)
-      probe1.expectMsgType[GetSuccess[_]]
+      probe1.expectMsgType[GetSuccess[?]]
       replicator.tell(Update(KeyE, GCounter(), writeMajority, Some(153))(_ :+ 1), probe1.ref)
       // verify read your own writes, without waiting for the UpdateSuccess reply
       // note that the order of the replies are not defined, and therefore we use separate probes
@@ -527,7 +527,7 @@ class ReplicatorSpec extends MultiNodeSpec(ReplicatorSpec) with STMultiNodeSpec
         replicator ! Update(KeyF, GCounter(), writeTwo)(_ :+ 1)
       }
       val results = receiveN(100)
-      results.map(_.getClass).toSet should be(Set(classOf[UpdateSuccess[_]]))
+      results.map(_.getClass).toSet should be(Set(classOf[UpdateSuccess[?]]))
     }
     enterBarrier("100-updates-done")
     runOn(first, second, third) {
@@ -541,7 +541,7 @@ class ReplicatorSpec extends MultiNodeSpec(ReplicatorSpec) with STMultiNodeSpec
   "read-repair happens before GetSuccess" in {
     runOn(first) {
       replicator ! Update(KeyG, ORSet(), writeTwo)(_ :+ "a" :+ "b")
-      expectMsgType[UpdateSuccess[_]]
+      expectMsgType[UpdateSuccess[?]]
     }
     enterBarrier("a-b-added-to-G")
     runOn(second) {
diff --git a/distributed-data/src/multi-jvm/scala/org/apache/pekko/cluster/ddata/WildcardSubscribeSpec.scala b/distributed-data/src/multi-jvm/scala/org/apache/pekko/cluster/ddata/WildcardSubscribeSpec.scala
index 4bd29743d7..82caf3c216 100644
--- a/distributed-data/src/multi-jvm/scala/org/apache/pekko/cluster/ddata/WildcardSubscribeSpec.scala
+++ b/distributed-data/src/multi-jvm/scala/org/apache/pekko/cluster/ddata/WildcardSubscribeSpec.scala
@@ -76,26 +76,26 @@ class WildcardSubscribeSpec extends MultiNodeSpec(WildcardSubscribeSpec) with ST
         replicator ! Subscribe(GCounterKey("counter-*"), subscriberProbe.ref)
 
         replicator ! Update(KeyA, GCounter.empty, WriteLocal)(_ :+ 1)
-        expectMsgType[UpdateSuccess[_]]
+        expectMsgType[UpdateSuccess[?]]
         val chg1 = subscriberProbe.expectMsgType[Changed[GCounter]]
         chg1.key should ===(KeyA)
         chg1.key.getClass should ===(KeyA.getClass)
         chg1.get(KeyA).value should ===(1)
 
         replicator ! Update(KeyA, GCounter.empty, WriteLocal)(_ :+ 1)
-        expectMsgType[UpdateSuccess[_]]
+        expectMsgType[UpdateSuccess[?]]
         val chg2 = subscriberProbe.expectMsgType[Changed[GCounter]]
         chg2.key should ===(KeyA)
         chg2.get(KeyA).value should ===(2)
 
         replicator ! Update(KeyB, GCounter.empty, WriteLocal)(_ :+ 1)
-        expectMsgType[UpdateSuccess[_]]
+        expectMsgType[UpdateSuccess[?]]
         val chg3 = subscriberProbe.expectMsgType[Changed[GCounter]]
         chg3.key should ===(KeyB)
         chg3.get(KeyB).value should ===(1)
 
         replicator ! Update(KeyOtherA, GCounter.empty, WriteLocal)(_ :+ 17)
-        expectMsgType[UpdateSuccess[_]]
+        expectMsgType[UpdateSuccess[?]]
         subscriberProbe.expectNoMessage(200.millis)
 
         // a few more subscribers
@@ -122,7 +122,7 @@ class WildcardSubscribeSpec extends MultiNodeSpec(WildcardSubscribeSpec) with ST
         subscriberProbeOther.expectMsgType[Changed[GCounter]].get(KeyOtherA).value should ===(17)
 
         replicator ! Update(KeyB, GCounter.empty, WriteLocal)(_ :+ 10)
-        expectMsgType[UpdateSuccess[_]]
+        expectMsgType[UpdateSuccess[?]]
         val chg4 = subscriberProbe.expectMsgType[Changed[GCounter]]
         chg4.key should ===(KeyB)
         chg4.get(KeyB).value should ===(11)
@@ -133,7 +133,7 @@ class WildcardSubscribeSpec extends MultiNodeSpec(WildcardSubscribeSpec) with ST
         // unsubscribe
         replicator ! Unsubscribe(GCounterKey("counter-*"), subscriberProbe.ref)
         replicator ! Update(KeyB, GCounter.empty, WriteLocal)(_ :+ 5)
-        expectMsgType[UpdateSuccess[_]]
+        expectMsgType[UpdateSuccess[?]]
         subscriberProbe.expectNoMessage(200.millis)
         val chg6 = subscriberProbe2.expectMsgType[Changed[GCounter]]
         chg6.key should ===(KeyB)
@@ -149,7 +149,7 @@ class WildcardSubscribeSpec extends MultiNodeSpec(WildcardSubscribeSpec) with ST
         replicator ! Subscribe(GCounterKey("expiry-*"), subscriberProbe.ref)
 
         replicator ! Update(KeyExpiryA, GCounter.empty, WriteLocal)(_ :+ 1)
-        expectMsgType[UpdateSuccess[_]]
+        expectMsgType[UpdateSuccess[?]]
         subscriberProbe.expectMsgType[Changed[GCounter]]
 
         replicator ! Get(KeyExpiryA, ReadLocal)
@@ -162,7 +162,7 @@ class WildcardSubscribeSpec extends MultiNodeSpec(WildcardSubscribeSpec) with ST
 
         // same key can be used again
         replicator ! Update(KeyExpiryA, GCounter.empty, WriteLocal)(_ :+ 2)
-        expectMsgType[UpdateSuccess[_]]
+        expectMsgType[UpdateSuccess[?]]
         subscriberProbe.expectMsgType[Changed[GCounter]]
         replicator ! Get(KeyExpiryA, ReadLocal)
         expectMsgType[GetSuccess[GCounter]].get(KeyExpiryA).value should ===(2)
@@ -174,7 +174,7 @@ class WildcardSubscribeSpec extends MultiNodeSpec(WildcardSubscribeSpec) with ST
     "notify when changed from another node" in {
       runOn(first) {
         replicator ! Update(KeyOtherA, GCounter.empty, WriteLocal)(_ :+ 1)
-        expectMsgType[UpdateSuccess[_]]
+        expectMsgType[UpdateSuccess[?]]
         enterBarrier("updated-1")
 
         enterBarrier("second-joined")
@@ -182,7 +182,7 @@ class WildcardSubscribeSpec extends MultiNodeSpec(WildcardSubscribeSpec) with ST
         enterBarrier("received-1")
 
         replicator ! Update(KeyOtherA, GCounter.empty, WriteLocal)(_ :+ 1)
-        expectMsgType[UpdateSuccess[_]]
+        expectMsgType[UpdateSuccess[?]]
         enterBarrier("updated-2")
 
         enterBarrier("received-2")
diff --git a/distributed-data/src/test/scala/org/apache/pekko/cluster/ddata/LocalConcurrencySpec.scala b/distributed-data/src/test/scala/org/apache/pekko/cluster/ddata/LocalConcurrencySpec.scala
index 3f7d66abe7..15803d8b2e 100644
--- a/distributed-data/src/test/scala/org/apache/pekko/cluster/ddata/LocalConcurrencySpec.scala
+++ b/distributed-data/src/test/scala/org/apache/pekko/cluster/ddata/LocalConcurrencySpec.scala
@@ -88,7 +88,7 @@ class LocalConcurrencySpec(_system: ActorSystem)
       val expected = ((1 to numMessages).map("a" + _) ++ (1 to numMessages).map("b" + _)).toSet
       awaitAssert {
         replicator ! Replicator.Get(Updater.key, Replicator.ReadLocal)
-        val elements = expectMsgType[Replicator.GetSuccess[_]].get(Updater.key) match {
+        val elements = expectMsgType[Replicator.GetSuccess[?]].get(Updater.key) match {
           case ORSet(e) => e
           case _        => fail()
         }
diff --git a/distributed-data/src/test/scala/org/apache/pekko/cluster/ddata/LotsOfDataBot.scala b/distributed-data/src/test/scala/org/apache/pekko/cluster/ddata/LotsOfDataBot.scala
index 7e5bb5b029..c88fd80f14 100644
--- a/distributed-data/src/test/scala/org/apache/pekko/cluster/ddata/LotsOfDataBot.scala
+++ b/distributed-data/src/test/scala/org/apache/pekko/cluster/ddata/LotsOfDataBot.scala
@@ -122,7 +122,7 @@ class LotsOfDataBot extends Actor with ActorLogging {
         }
       }
 
-    case _: UpdateResponse[_]      => // ignore
+    case _: UpdateResponse[?]      => // ignore
     case c @ Changed(ORSetKey(id)) =>
       val elements = c.dataValue match {
         case ORSet(e) => e
diff --git a/distributed-data/src/test/scala/org/apache/pekko/cluster/ddata/ReplicatorWildcardSubscriptionSpec.scala b/distributed-data/src/test/scala/org/apache/pekko/cluster/ddata/ReplicatorWildcardSubscriptionSpec.scala
index 11816597b9..2c87aaacc8 100644
--- a/distributed-data/src/test/scala/org/apache/pekko/cluster/ddata/ReplicatorWildcardSubscriptionSpec.scala
+++ b/distributed-data/src/test/scala/org/apache/pekko/cluster/ddata/ReplicatorWildcardSubscriptionSpec.scala
@@ -66,7 +66,7 @@ class ReplicatorWildcardSubscriptionSpec(_system: ActorSystem)
 
       // Update a matching key
       replicator ! Update(KeyA1, GCounter.empty, WriteLocal)(_ :+ 1)
-      expectMsgType[UpdateSuccess[_]]
+      expectMsgType[UpdateSuccess[?]]
 
       val changed1 = probe.expectMsgType[Changed[GCounter]](5.seconds)
       changed1.key.id should ===("notif-counter-a1")
@@ -74,7 +74,7 @@ class ReplicatorWildcardSubscriptionSpec(_system: ActorSystem)
 
       // Update another matching key
       replicator ! Update(KeyA2, GCounter.empty, WriteLocal)(_ :+ 2)
-      expectMsgType[UpdateSuccess[_]]
+      expectMsgType[UpdateSuccess[?]]
 
       val changed2 = probe.expectMsgType[Changed[GCounter]](5.seconds)
       changed2.key.id should ===("notif-counter-a2")
@@ -82,7 +82,7 @@ class ReplicatorWildcardSubscriptionSpec(_system: ActorSystem)
 
       // Update a non-matching key - no notification expected
       replicator ! Update(KeyB, GCounter.empty, WriteLocal)(_ :+ 1)
-      expectMsgType[UpdateSuccess[_]]
+      expectMsgType[UpdateSuccess[?]]
 
       probe.expectNoMessage(500.millis)
     }
@@ -92,7 +92,7 @@ class ReplicatorWildcardSubscriptionSpec(_system: ActorSystem)
       val WildcardKey = GCounterKey("current-counter-*")
 
       replicator ! Update(KeyA, GCounter.empty, WriteLocal)(_ :+ 10)
-      expectMsgType[UpdateSuccess[_]]
+      expectMsgType[UpdateSuccess[?]]
 
       // Subscribe after the key already exists
       val subscribeProbe = TestProbe()
@@ -109,7 +109,7 @@ class ReplicatorWildcardSubscriptionSpec(_system: ActorSystem)
       val WildcardKey = GCounterKey("unsub-counter-*")
 
       replicator ! Update(KeyA, GCounter.empty, WriteLocal)(_ :+ 1)
-      expectMsgType[UpdateSuccess[_]]
+      expectMsgType[UpdateSuccess[?]]
 
       val probe = TestProbe()
       replicator ! Subscribe(WildcardKey, probe.ref)
@@ -122,7 +122,7 @@ class ReplicatorWildcardSubscriptionSpec(_system: ActorSystem)
 
       // Update a matching key - no notification expected after unsubscribe
       replicator ! Update(KeyA, GCounter.empty, WriteLocal)(_ :+ 100)
-      expectMsgType[UpdateSuccess[_]]
+      expectMsgType[UpdateSuccess[?]]
 
       probe.expectNoMessage(500.millis)
     }
diff --git a/docs/src/test/scala/docs/actor/SharedMutableStateDocSpec.scala b/docs/src/test/scala/docs/actor/SharedMutableStateDocSpec.scala
index f61aa1145a..3c1da09951 100644
--- a/docs/src/test/scala/docs/actor/SharedMutableStateDocSpec.scala
+++ b/docs/src/test/scala/docs/actor/SharedMutableStateDocSpec.scala
@@ -33,7 +33,7 @@ class SharedMutableStateDocSpec {
 
   class CleanUpActor extends Actor {
     def receive = {
-      case set: mutable.Set[_] => set.clear()
+      case set: mutable.Set[?] => set.clear()
     }
   }
 
diff --git a/docs/src/test/scala/docs/ddata/DistributedDataDocSpec.scala b/docs/src/test/scala/docs/ddata/DistributedDataDocSpec.scala
index 81c5e8c68f..8f45d39994 100644
--- a/docs/src/test/scala/docs/ddata/DistributedDataDocSpec.scala
+++ b/docs/src/test/scala/docs/ddata/DistributedDataDocSpec.scala
@@ -95,7 +95,7 @@ object DistributedDataDocSpec {
           replicator ! Update(DataKey, ORSet.empty[String], WriteLocal)(_.remove(s))
         }
 
-      case _: UpdateResponse[_] => // ignore
+      case _: UpdateResponse[?] => // ignore
       case c @ Changed(DataKey) =>
         val data = c.get(DataKey)
         log.info("Current elements: {}", data.elements)
@@ -136,14 +136,14 @@ class DistributedDataDocSpec extends PekkoSpec(DistributedDataDocSpec.config) {
     replicator ! Update(ActiveFlagKey, Flag.Disabled, writeAll)(_.switchOn)
     // #update
 
-    probe.expectMsgType[UpdateResponse[_]] match {
+    probe.expectMsgType[UpdateResponse[?]] match {
       // #update-response1
       case UpdateSuccess(Counter1Key, req) => // ok
       // #update-response1
       case unexpected => fail("Unexpected response: " + unexpected)
     }
 
-    probe.expectMsgType[UpdateResponse[_]] match {
+    probe.expectMsgType[UpdateResponse[?]] match {
       // #update-response2
       case UpdateSuccess(Set1Key, req) => // ok
       case UpdateTimeout(Set1Key, req) =>
@@ -203,7 +203,7 @@ class DistributedDataDocSpec extends PekkoSpec(DistributedDataDocSpec.config) {
     replicator ! Get(ActiveFlagKey, readAll)
     // #get
 
-    probe.expectMsgType[GetResponse[_]] match {
+    probe.expectMsgType[GetResponse[?]] match {
       // #get-response1
       case g @ GetSuccess(Counter1Key, req) =>
         val value = g.get(Counter1Key).value
@@ -212,7 +212,7 @@ class DistributedDataDocSpec extends PekkoSpec(DistributedDataDocSpec.config) {
       case unexpected => fail("Unexpected response: " + unexpected)
     }
 
-    probe.expectMsgType[GetResponse[_]] match {
+    probe.expectMsgType[GetResponse[?]] match {
       // #get-response2
       case g @ GetSuccess(Set1Key, req) =>
         val elements = g.get(Set1Key).elements
diff --git a/docs/src/test/scala/docs/ddata/ShoppingCart.scala b/docs/src/test/scala/docs/ddata/ShoppingCart.scala
index ffb9c2e65a..d0ef12f8c6 100644
--- a/docs/src/test/scala/docs/ddata/ShoppingCart.scala
+++ b/docs/src/test/scala/docs/ddata/ShoppingCart.scala
@@ -118,9 +118,9 @@ class ShoppingCart(userId: String) extends Actor {
   // #remove-item
 
   def receiveOther: Receive = {
-    case _: UpdateSuccess[_] | _: UpdateTimeout[_] =>
+    case _: UpdateSuccess[?] | _: UpdateTimeout[?] =>
     // UpdateTimeout, will eventually be replicated
-    case e: UpdateFailure[_] => throw new IllegalStateException("Unexpected failure: " + e)
+    case e: UpdateFailure[?] => throw new IllegalStateException("Unexpected failure: " + e)
   }
 
 }
diff --git a/docs/src/test/scala/docs/ddata/protobuf/TwoPhaseSetSerializer.scala b/docs/src/test/scala/docs/ddata/protobuf/TwoPhaseSetSerializer.scala
index 249b72cc4d..379657b413 100644
--- a/docs/src/test/scala/docs/ddata/protobuf/TwoPhaseSetSerializer.scala
+++ b/docs/src/test/scala/docs/ddata/protobuf/TwoPhaseSetSerializer.scala
@@ -36,7 +36,7 @@ class TwoPhaseSetSerializer(val system: ExtendedActorSystem) extends Serializer
     case _              => throw new IllegalArgumentException(s"Can't serialize object of type ${obj.getClass}")
   }
 
-  override def fromBinary(bytes: Array[Byte], clazz: Option[Class[_]]): AnyRef = {
+  override def fromBinary(bytes: Array[Byte], clazz: Option[Class[?]]): AnyRef = {
     twoPhaseSetFromBinary(bytes)
   }
 
@@ -78,7 +78,7 @@ class TwoPhaseSetSerializerWithCompression(system: ExtendedActorSystem) extends
     case _              => throw new IllegalArgumentException(s"Can't serialize object of type ${obj.getClass}")
   }
 
-  override def fromBinary(bytes: Array[Byte], clazz: Option[Class[_]]): AnyRef = {
+  override def fromBinary(bytes: Array[Byte], clazz: Option[Class[?]]): AnyRef = {
     twoPhaseSetFromBinary(decompress(bytes))
   }
   // #compression
diff --git a/docs/src/test/scala/docs/ddata/protobuf/TwoPhaseSetSerializer2.scala b/docs/src/test/scala/docs/ddata/protobuf/TwoPhaseSetSerializer2.scala
index 89eae2ae9f..2760a7c33e 100644
--- a/docs/src/test/scala/docs/ddata/protobuf/TwoPhaseSetSerializer2.scala
+++ b/docs/src/test/scala/docs/ddata/protobuf/TwoPhaseSetSerializer2.scala
@@ -33,7 +33,7 @@ class TwoPhaseSetSerializer2(val system: ExtendedActorSystem) extends Serializer
     case _              => throw new IllegalArgumentException(s"Can't serialize object of type ${obj.getClass}")
   }
 
-  override def fromBinary(bytes: Array[Byte], clazz: Option[Class[_]]): AnyRef = {
+  override def fromBinary(bytes: Array[Byte], clazz: Option[Class[?]]): AnyRef = {
     twoPhaseSetFromBinary(bytes)
   }
 
diff --git a/docs/src/test/scala/docs/event/LoggingDocSpec.scala b/docs/src/test/scala/docs/event/LoggingDocSpec.scala
index cc36f7957f..6dafb0db6d 100644
--- a/docs/src/test/scala/docs/event/LoggingDocSpec.scala
+++ b/docs/src/test/scala/docs/event/LoggingDocSpec.scala
@@ -112,7 +112,7 @@ object LoggingDocSpec {
   object MyType {
     implicit val logSource: LogSource[AnyRef] = new LogSource[AnyRef] {
       def genString(o: AnyRef): String = o.getClass.getName
-      override def getClazz(o: AnyRef): Class[_] = o.getClass
+      override def getClazz(o: AnyRef): Class[?] = o.getClass
     }
   }
 
diff --git a/docs/src/test/scala/docs/io/EchoServer.scala b/docs/src/test/scala/docs/io/EchoServer.scala
index 83076bcffe..8382a21e2b 100644
--- a/docs/src/test/scala/docs/io/EchoServer.scala
+++ b/docs/src/test/scala/docs/io/EchoServer.scala
@@ -37,7 +37,7 @@ object EchoServer extends App {
   system.terminate()
 }
 
-class EchoManager(handlerClass: Class[_]) extends Actor with ActorLogging {
+class EchoManager(handlerClass: Class[?]) extends Actor with ActorLogging {
 
   import Tcp._
   import context.system
diff --git a/docs/src/test/scala/docs/persistence/PersistenceSerializerDocSpec.scala b/docs/src/test/scala/docs/persistence/PersistenceSerializerDocSpec.scala
index 819151b36b..b41f8fedb7 100644
--- a/docs/src/test/scala/docs/persistence/PersistenceSerializerDocSpec.scala
+++ b/docs/src/test/scala/docs/persistence/PersistenceSerializerDocSpec.scala
@@ -54,12 +54,12 @@ class MyPayloadSerializer extends Serializer {
   def identifier: Int = 77124
   def includeManifest: Boolean = false
   def toBinary(o: AnyRef): Array[Byte] = ???
-  def fromBinary(bytes: Array[Byte], manifest: Option[Class[_]]): AnyRef = ???
+  def fromBinary(bytes: Array[Byte], manifest: Option[Class[?]]): AnyRef = ???
 }
 
 class MySnapshotSerializer extends Serializer {
   def identifier: Int = 77125
   def includeManifest: Boolean = false
   def toBinary(o: AnyRef): Array[Byte] = ???
-  def fromBinary(bytes: Array[Byte], manifest: Option[Class[_]]): AnyRef = ???
+  def fromBinary(bytes: Array[Byte], manifest: Option[Class[?]]): AnyRef = ???
 }
diff --git a/docs/src/test/scala/docs/serialization/SerializationDocSpec.scala b/docs/src/test/scala/docs/serialization/SerializationDocSpec.scala
index ab58efde98..fc5ca47363 100644
--- a/docs/src/test/scala/docs/serialization/SerializationDocSpec.scala
+++ b/docs/src/test/scala/docs/serialization/SerializationDocSpec.scala
@@ -53,7 +53,7 @@ package docs.serialization {
 
     // "fromBinary" deserializes the given array,
     // using the type hint (if any, see "includeManifest" above)
-    def fromBinary(bytes: Array[Byte], clazz: Option[Class[_]]): AnyRef = {
+    def fromBinary(bytes: Array[Byte], clazz: Option[Class[?]]): AnyRef = {
       // Put your code that deserializes here
       // #...
       null
diff --git a/docs/src/test/scala/docs/stream/GraphDSLDocSpec.scala b/docs/src/test/scala/docs/stream/GraphDSLDocSpec.scala
index 5d7c2045d1..bd63246f62 100644
--- a/docs/src/test/scala/docs/stream/GraphDSLDocSpec.scala
+++ b/docs/src/test/scala/docs/stream/GraphDSLDocSpec.scala
@@ -110,9 +110,9 @@ class GraphDSLDocSpec extends PekkoSpec {
 
       // It is important to provide the list of all input and output
       // ports with a stable order. Duplicates are not allowed.
-      override val inlets: immutable.Seq[Inlet[_]] =
+      override val inlets: immutable.Seq[Inlet[?]] =
         jobsIn :: priorityJobsIn :: Nil
-      override val outlets: immutable.Seq[Outlet[_]] =
+      override val outlets: immutable.Seq[Outlet[?]] =
         resultsOut :: Nil
 
       // A Shape must be able to create a copy of itself. Basically
diff --git a/docs/src/test/scala/docs/stream/cookbook/RecipeAdhocSource.scala b/docs/src/test/scala/docs/stream/cookbook/RecipeAdhocSource.scala
index a1b4fa3877..b90fb3f054 100644
--- a/docs/src/test/scala/docs/stream/cookbook/RecipeAdhocSource.scala
+++ b/docs/src/test/scala/docs/stream/cookbook/RecipeAdhocSource.scala
@@ -27,7 +27,7 @@ import scala.concurrent.duration._
 class RecipeAdhocSource extends RecipeSpec {
 
   // #adhoc-source
-  def adhocSource[T](source: Source[T, _], timeout: FiniteDuration, maxRetries: Int): Source[T, _] =
+  def adhocSource[T](source: Source[T, ?], timeout: FiniteDuration, maxRetries: Int): Source[T, ?] =
     Source.lazySource(() =>
       source
         .backpressureTimeout(timeout)
diff --git a/docs/src/test/scala/docs/stream/operators/JavaCollectorDocExample.scala b/docs/src/test/scala/docs/stream/operators/JavaCollectorDocExample.scala
index 29bfcd1b4c..b13829e5f3 100644
--- a/docs/src/test/scala/docs/stream/operators/JavaCollectorDocExample.scala
+++ b/docs/src/test/scala/docs/stream/operators/JavaCollectorDocExample.scala
@@ -30,7 +30,7 @@ object JavaCollectorDocExample {
   val source: Source[String, NotUsed] =
     Source(List("Apache", "Pekko", "Streams"))
 
-  val sink: Sink[String, _] =
+  val sink: Sink[String, ?] =
     StreamConverters.javaCollector(() => Collectors.toList[String]())
   // #javaCollector
 }
diff --git a/docs/src/test/scala/docs/stream/operators/source/Zip.scala b/docs/src/test/scala/docs/stream/operators/source/Zip.scala
index 14b67bb03e..1a6056522e 100644
--- a/docs/src/test/scala/docs/stream/operators/source/Zip.scala
+++ b/docs/src/test/scala/docs/stream/operators/source/Zip.scala
@@ -18,7 +18,7 @@ import org.apache.pekko.stream.scaladsl.Source
 
 object Zip {
 
-  implicit val system: ActorSystem[_] = ???
+  implicit val system: ActorSystem[?] = ???
 
   def zipN(): Unit = {
     // #zipN-simple
diff --git a/docs/src/test/scala/docs/stream/operators/sourceorflow/Limit.scala b/docs/src/test/scala/docs/stream/operators/sourceorflow/Limit.scala
index 159ba26f01..1bfdd2e8a6 100644
--- a/docs/src/test/scala/docs/stream/operators/sourceorflow/Limit.scala
+++ b/docs/src/test/scala/docs/stream/operators/sourceorflow/Limit.scala
@@ -22,7 +22,7 @@ import scala.concurrent.Future
 
 object Limit {
 
-  implicit val system: ActorSystem[_] = ???
+  implicit val system: ActorSystem[?] = ???
 
   def simple(): Unit = {
     // #simple
diff --git a/docs/src/test/scala/docs/stream/operators/sourceorflow/LimitWeighted.scala b/docs/src/test/scala/docs/stream/operators/sourceorflow/LimitWeighted.scala
index c604a2322c..e2c3ed8384 100644
--- a/docs/src/test/scala/docs/stream/operators/sourceorflow/LimitWeighted.scala
+++ b/docs/src/test/scala/docs/stream/operators/sourceorflow/LimitWeighted.scala
@@ -22,7 +22,7 @@ import scala.concurrent.Future
 
 object LimitWeighted {
 
-  implicit val system: ActorSystem[_] = ???
+  implicit val system: ActorSystem[?] = ???
 
   def simple(): Unit = {
     // #simple
diff --git a/multi-node-testkit/src/main/scala/org/apache/pekko/remote/testconductor/Player.scala b/multi-node-testkit/src/main/scala/org/apache/pekko/remote/testconductor/Player.scala
index e7a94c0a86..0e525dbb5d 100644
--- a/multi-node-testkit/src/main/scala/org/apache/pekko/remote/testconductor/Player.scala
+++ b/multi-node-testkit/src/main/scala/org/apache/pekko/remote/testconductor/Player.scala
@@ -54,11 +54,11 @@ object Player {
       case Transition(_, f: ClientFSM.State, t: ClientFSM.State)
           if f == AwaitDone && t == Connected => // SI-5900 workaround
         waiting ! Done; context.stop(self)
-      case t: Transition[_] =>
+      case t: Transition[?] =>
         waiting ! Status.Failure(new RuntimeException("unexpected transition: " + t)); context.stop(self)
       case CurrentState(_, s: ClientFSM.State) if s == Connected => // SI-5900 workaround
         waiting ! Done; context.stop(self)
-      case _: CurrentState[_] =>
+      case _: CurrentState[?] =>
     }
 
   }
diff --git a/multi-node-testkit/src/main/scala/org/apache/pekko/remote/testkit/MultiNodeSpec.scala b/multi-node-testkit/src/main/scala/org/apache/pekko/remote/testkit/MultiNodeSpec.scala
index a69e509780..a9dd7f0e6d 100644
--- a/multi-node-testkit/src/main/scala/org/apache/pekko/remote/testkit/MultiNodeSpec.scala
+++ b/multi-node-testkit/src/main/scala/org/apache/pekko/remote/testkit/MultiNodeSpec.scala
@@ -465,9 +465,9 @@ abstract class MultiNodeSpec(
    */
   def node(role: RoleName): ActorPath = RootActorPath(testConductor.getAddressFor(role).await)
 
-  def muteDeadLetters(messageClasses: Class[_]*)(sys: ActorSystem = system): Unit =
+  def muteDeadLetters(messageClasses: Class[?]*)(sys: ActorSystem = system): Unit =
     if (!sys.log.isDebugEnabled) {
-      def mute(clazz: Class[_]): Unit =
+      def mute(clazz: Class[?]): Unit =
         sys.eventStream.publish(Mute(DeadLettersFilter(clazz)(occurrences = Int.MaxValue)))
       if (messageClasses.isEmpty) mute(classOf[AnyRef])
       else messageClasses.foreach(mute)
diff --git a/osgi/src/main/scala/org/apache/pekko/osgi/ActorSystemActivator.scala b/osgi/src/main/scala/org/apache/pekko/osgi/ActorSystemActivator.scala
index 9ce75fb961..d246a8bfe6 100644
--- a/osgi/src/main/scala/org/apache/pekko/osgi/ActorSystemActivator.scala
+++ b/osgi/src/main/scala/org/apache/pekko/osgi/ActorSystemActivator.scala
@@ -37,7 +37,7 @@ import com.typesafe.config.{ Config, ConfigFactory }
 abstract class ActorSystemActivator extends BundleActivator {
 
   private var system: Option[ActorSystem] = None
-  private var registration: Option[ServiceRegistration[_]] = None
+  private var registration: Option[ServiceRegistration[?]] = None
 
   /**
    * Implement this method to add your own actors to the ActorSystem.  If you want to share the actor
@@ -90,7 +90,7 @@ abstract class ActorSystemActivator extends BundleActivator {
   /**
    * Convenience method to find a service by its reference.
    */
-  def serviceForReference[T](context: BundleContext, reference: ServiceReference[_]): T =
+  def serviceForReference[T](context: BundleContext, reference: ServiceReference[?]): T =
     context.getService(reference).asInstanceOf[T]
 
   /**
diff --git a/osgi/src/main/scala/org/apache/pekko/osgi/BundleDelegatingClassLoader.scala b/osgi/src/main/scala/org/apache/pekko/osgi/BundleDelegatingClassLoader.scala
index 2423fd1e41..baf32fef86 100644
--- a/osgi/src/main/scala/org/apache/pekko/osgi/BundleDelegatingClassLoader.scala
+++ b/osgi/src/main/scala/org/apache/pekko/osgi/BundleDelegatingClassLoader.scala
@@ -49,8 +49,8 @@ class BundleDelegatingClassLoader(bundle: Bundle, fallBackClassLoader: ClassLoad
 
   private val bundles = findTransitiveBundles(bundle).toList
 
-  override def findClass(name: String): Class[_] = {
-    @tailrec def find(remaining: List[Bundle]): Class[_] = {
+  override def findClass(name: String): Class[?] = {
+    @tailrec def find(remaining: List[Bundle]): Class[?] = {
       if (remaining.isEmpty) throw new ClassNotFoundException(name)
       else
         Try { remaining.head.loadClass(name) } match {
diff --git a/osgi/src/test/scala/org/apache/pekko/osgi/PojoSRTestSupport.scala b/osgi/src/test/scala/org/apache/pekko/osgi/PojoSRTestSupport.scala
index 5469a3facf..49f45d5b99 100644
--- a/osgi/src/test/scala/org/apache/pekko/osgi/PojoSRTestSupport.scala
+++ b/osgi/src/test/scala/org/apache/pekko/osgi/PojoSRTestSupport.scala
@@ -150,7 +150,7 @@ class BundleDescriptorBuilder(name: String) {
   /**
    * Add a Bundle activator to our test bundle
    */
-  def withActivator(activator: Class[_ <: BundleActivator]): BundleDescriptorBuilder = {
+  def withActivator(activator: Class[? <: BundleActivator]): BundleDescriptorBuilder = {
     tinybundle.setHeader(Constants.BUNDLE_ACTIVATOR, activator.getName)
     this
   }
diff --git a/persistence-query/src/main/scala/org/apache/pekko/persistence/query/internal/QuerySerializer.scala b/persistence-query/src/main/scala/org/apache/pekko/persistence/query/internal/QuerySerializer.scala
index 25ffdeabc1..bbd1780560 100644
--- a/persistence-query/src/main/scala/org/apache/pekko/persistence/query/internal/QuerySerializer.scala
+++ b/persistence-query/src/main/scala/org/apache/pekko/persistence/query/internal/QuerySerializer.scala
@@ -62,14 +62,14 @@ import pekko.serialization.Serializers
   private val timestampOffsetSeparator = ';'
 
   override def manifest(o: AnyRef): String = o match {
-    case _: EventEnvelope[_] => EventEnvelopeManifest
+    case _: EventEnvelope[?] => EventEnvelopeManifest
     case offset: Offset      => toStorageRepresentation(offset)._2
     case _                   =>
       throw new IllegalArgumentException(s"Can't serialize object of type ${o.getClass} in [${getClass.getName}]")
   }
 
   override def toBinary(o: AnyRef): Array[Byte] = o match {
-    case env: EventEnvelope[_] =>
+    case env: EventEnvelope[?] =>
       val builder = QueryMessages.EventEnvelope.newBuilder()
 
       val (offset, offsetManifest) = toStorageRepresentation(env.offset)
diff --git a/persistence-query/src/main/scala/org/apache/pekko/persistence/query/journal/leveldb/AllPersistenceIdsStage.scala b/persistence-query/src/main/scala/org/apache/pekko/persistence/query/journal/leveldb/AllPersistenceIdsStage.scala
index e008b1abcb..011853a8b6 100644
--- a/persistence-query/src/main/scala/org/apache/pekko/persistence/query/journal/leveldb/AllPersistenceIdsStage.scala
+++ b/persistence-query/src/main/scala/org/apache/pekko/persistence/query/journal/leveldb/AllPersistenceIdsStage.scala
@@ -46,7 +46,7 @@ final private[pekko] class AllPersistenceIdsStage(liveQuery: Boolean, writeJourn
       val journal: ActorRef = Persistence(mat.system).journalFor(writeJournalPluginId)
       var initialResponseReceived = false
 
-      override protected def logSource: Class[_] = classOf[AllPersistenceIdsStage]
+      override protected def logSource: Class[?] = classOf[AllPersistenceIdsStage]
 
       override def preStart(): Unit = {
         journal.tell(LeveldbJournal.SubscribeAllPersistenceIds, getStageActor(journalInteraction).ref)
diff --git a/persistence-query/src/main/scala/org/apache/pekko/persistence/query/journal/leveldb/EventsByPersistenceIdStage.scala b/persistence-query/src/main/scala/org/apache/pekko/persistence/query/journal/leveldb/EventsByPersistenceIdStage.scala
index e351830a1d..614811f968 100644
--- a/persistence-query/src/main/scala/org/apache/pekko/persistence/query/journal/leveldb/EventsByPersistenceIdStage.scala
+++ b/persistence-query/src/main/scala/org/apache/pekko/persistence/query/journal/leveldb/EventsByPersistenceIdStage.scala
@@ -73,7 +73,7 @@ final private[pekko] class EventsByPersistenceIdStage(
       var nextSequenceNr = fromSequenceNr
       var toSequenceNr = initialToSequenceNr
 
-      override protected def logSource: Class[_] = classOf[EventsByPersistenceIdStage]
+      override protected def logSource: Class[?] = classOf[EventsByPersistenceIdStage]
 
       override def preStart(): Unit = {
         stageActorRef = getStageActor(journalInteraction).ref
diff --git a/persistence-query/src/main/scala/org/apache/pekko/persistence/query/journal/leveldb/EventsByTagStage.scala b/persistence-query/src/main/scala/org/apache/pekko/persistence/query/journal/leveldb/EventsByTagStage.scala
index 32261327e9..4ab38707f6 100644
--- a/persistence-query/src/main/scala/org/apache/pekko/persistence/query/journal/leveldb/EventsByTagStage.scala
+++ b/persistence-query/src/main/scala/org/apache/pekko/persistence/query/journal/leveldb/EventsByTagStage.scala
@@ -73,7 +73,7 @@ final private[leveldb] class EventsByTagStage(
       var replayInProgress = false
       var outstandingReplay = false
 
-      override protected def logSource: Class[_] = classOf[EventsByTagStage]
+      override protected def logSource: Class[?] = classOf[EventsByTagStage]
 
       override def preStart(): Unit = {
         stageActorRef = getStageActor(journalInteraction).ref
diff --git a/persistence-query/src/main/scala/org/apache/pekko/persistence/query/typed/EventEnvelope.scala b/persistence-query/src/main/scala/org/apache/pekko/persistence/query/typed/EventEnvelope.scala
index 23cdbea46d..db828201de 100644
--- a/persistence-query/src/main/scala/org/apache/pekko/persistence/query/typed/EventEnvelope.scala
+++ b/persistence-query/src/main/scala/org/apache/pekko/persistence/query/typed/EventEnvelope.scala
@@ -235,7 +235,7 @@ final class EventEnvelope[Event](
   }
 
   override def equals(obj: Any): Boolean = obj match {
-    case other: EventEnvelope[_] =>
+    case other: EventEnvelope[?] =>
       offset == other.offset && persistenceId == other.persistenceId && sequenceNr == other.sequenceNr &&
       eventOption == other.eventOption && timestamp == other.timestamp && eventMetadata == other.eventMetadata &&
       entityType == other.entityType && slice == other.slice && filtered == other.filtered &&
diff --git a/persistence-shared/src/test/scala/org/apache/pekko/persistence/serialization/SerializerSpec.scala b/persistence-shared/src/test/scala/org/apache/pekko/persistence/serialization/SerializerSpec.scala
index 834fd124be..a591ecb4bf 100644
--- a/persistence-shared/src/test/scala/org/apache/pekko/persistence/serialization/SerializerSpec.scala
+++ b/persistence-shared/src/test/scala/org/apache/pekko/persistence/serialization/SerializerSpec.scala
@@ -394,7 +394,7 @@ class MyPayloadSerializer extends Serializer {
     case x               => throw new NotSerializableException(s"Unexpected object: $x")
   }
 
-  def fromBinary(bytes: Array[Byte], manifest: Option[Class[_]]): AnyRef = manifest match {
+  def fromBinary(bytes: Array[Byte], manifest: Option[Class[?]]): AnyRef = manifest match {
     case Some(MyPayloadClass) => MyPayload(s"${new String(bytes, UTF_8)}.")
     case Some(c)              => throw new Exception(s"unexpected manifest $c")
     case None                 => throw new Exception("no manifest")
@@ -438,7 +438,7 @@ class MySnapshotSerializer extends Serializer {
     case x                => throw new NotSerializableException(s"Unexpected object: $x")
   }
 
-  def fromBinary(bytes: Array[Byte], manifest: Option[Class[_]]): AnyRef = manifest match {
+  def fromBinary(bytes: Array[Byte], manifest: Option[Class[?]]): AnyRef = manifest match {
     case Some(MySnapshotClass) => MySnapshot(s"${new String(bytes, UTF_8)}.")
     case Some(c)               => throw new Exception(s"unexpected manifest $c")
     case None                  => throw new Exception("no manifest")
diff --git a/persistence-testkit/src/main/scala/org/apache/pekko/persistence/testkit/internal/EventSourcedBehaviorTestKitImpl.scala b/persistence-testkit/src/main/scala/org/apache/pekko/persistence/testkit/internal/EventSourcedBehaviorTestKitImpl.scala
index 654408a7ee..791392446e 100644
--- a/persistence-testkit/src/main/scala/org/apache/pekko/persistence/testkit/internal/EventSourcedBehaviorTestKitImpl.scala
+++ b/persistence-testkit/src/main/scala/org/apache/pekko/persistence/testkit/internal/EventSourcedBehaviorTestKitImpl.scala
@@ -98,7 +98,7 @@ import pekko.stream.scaladsl.Sink
 
   import EventSourcedBehaviorTestKitImpl._
 
-  private def system: ActorSystem[_] = actorTestKit.system
+  private def system: ActorSystem[?] = actorTestKit.system
   if (system.settings.config.getBoolean("pekko.persistence.testkit.events.serialize") ||
     system.settings.config.getBoolean("pekko.persistence.testkit.snapshots.serialize")) {
     system.log.warn(
@@ -177,7 +177,7 @@ import pekko.stream.scaladsl.Sink
   }
 
   private def getHighestSeqNr(): Long = {
-    implicit val sys: ActorSystem[_] = system
+    implicit val sys: ActorSystem[?] = system
     val result =
       queries.currentEventsByPersistenceId(persistenceId.id, 0L, toSequenceNr = Long.MaxValue).runWith(Sink.lastOption)
 
@@ -188,7 +188,7 @@ import pekko.stream.scaladsl.Sink
   }
 
   private def getEvents(fromSeqNr: Long): immutable.Seq[Event] = {
-    implicit val sys: ActorSystem[_] = system
+    implicit val sys: ActorSystem[?] = system
     val result =
       queries.currentEventsByPersistenceId(persistenceId.id, fromSeqNr, toSequenceNr = Long.MaxValue).runWith(Sink.seq)
 
diff --git a/persistence-testkit/src/main/scala/org/apache/pekko/persistence/testkit/internal/PersistenceProbeImpl.scala b/persistence-testkit/src/main/scala/org/apache/pekko/persistence/testkit/internal/PersistenceProbeImpl.scala
index d7ddd69043..637d5f2e82 100644
--- a/persistence-testkit/src/main/scala/org/apache/pekko/persistence/testkit/internal/PersistenceProbeImpl.scala
+++ b/persistence-testkit/src/main/scala/org/apache/pekko/persistence/testkit/internal/PersistenceProbeImpl.scala
@@ -46,7 +46,7 @@ private[pekko] object PersistenceProbeImpl {
         b: Behavior[Command],
         context: ActorContext[Command]): Option[EventSourcedBehaviorImpl[Command, Event, State]] = {
       b match {
-        case es: EventSourcedBehaviorImpl[Command, _, _] =>
+        case es: EventSourcedBehaviorImpl[Command, ?, ?] =>
           Some(es.asInstanceOf[EventSourcedBehaviorImpl[Command, Event, State]])
 
         case deferred: DeferredBehavior[Command] =>
@@ -74,7 +74,7 @@ private[pekko] object PersistenceProbeImpl {
         b: Behavior[Command],
         context: ActorContext[Command]): Option[DurableStateBehaviorImpl[Command, State]] =
       b match {
-        case ds: DurableStateBehaviorImpl[Command, _] =>
+        case ds: DurableStateBehaviorImpl[Command, ?] =>
           Some(ds.asInstanceOf[DurableStateBehaviorImpl[Command, State]])
 
         case deferred: DeferredBehavior[Command] => findDurableStateBehavior(deferred(context), context)
@@ -186,7 +186,7 @@ private[pekko] object PersistenceProbeImpl {
           effect match {
             case _: Stop.type       => shouldStop = true
             case _: UnstashAll.type => shouldUnstash = true
-            case cb: Callback[_]    => cb.sideEffect(state)
+            case cb: Callback[?]    => cb.sideEffect(state)
           }
         }
 
@@ -256,7 +256,7 @@ private[pekko] object PersistenceProbeImpl {
       @tailrec
       def applyEffects(curEffect: EffectImpl[State], sideEffects: immutable.Seq[SideEffect[State]]): Unit =
         curEffect match {
-          case CompositeEffect(eff: EffectImpl[_], se) =>
+          case CompositeEffect(eff: EffectImpl[?], se) =>
             applyEffects(eff.asInstanceOf[EffectImpl[State]], se ++ sideEffects)
 
           case Persist(st) =>
@@ -280,7 +280,7 @@ private[pekko] object PersistenceProbeImpl {
           effect match {
             case _: Stop.type       => shouldStop = true
             case _: UnstashAll.type => shouldUnstash = true
-            case cb: Callback[_]    => cb.sideEffect(state)
+            case cb: Callback[?]    => cb.sideEffect(state)
           }
         }
 
diff --git a/persistence-testkit/src/main/scala/org/apache/pekko/persistence/testkit/internal/SnapshotStorageEmulatorExtension.scala b/persistence-testkit/src/main/scala/org/apache/pekko/persistence/testkit/internal/SnapshotStorageEmulatorExtension.scala
index fa86080279..99f92f8d6e 100644
--- a/persistence-testkit/src/main/scala/org/apache/pekko/persistence/testkit/internal/SnapshotStorageEmulatorExtension.scala
+++ b/persistence-testkit/src/main/scala/org/apache/pekko/persistence/testkit/internal/SnapshotStorageEmulatorExtension.scala
@@ -34,7 +34,7 @@ private[testkit] object SnapshotStorageEmulatorExtension extends ExtensionId[Sna
   override def createExtension(system: ExtendedActorSystem): SnapshotStorageEmulatorExtension =
     new SnapshotStorageEmulatorExtension(system)
 
-  override def lookup: ExtensionId[_ <: Extension] =
+  override def lookup: ExtensionId[? <: Extension] =
     SnapshotStorageEmulatorExtension
 }
 
diff --git a/persistence-testkit/src/main/scala/org/apache/pekko/persistence/testkit/javadsl/EventSourcedBehaviorTestKit.scala b/persistence-testkit/src/main/scala/org/apache/pekko/persistence/testkit/javadsl/EventSourcedBehaviorTestKit.scala
index ca7b94031f..3695c8ef30 100644
--- a/persistence-testkit/src/main/scala/org/apache/pekko/persistence/testkit/javadsl/EventSourcedBehaviorTestKit.scala
+++ b/persistence-testkit/src/main/scala/org/apache/pekko/persistence/testkit/javadsl/EventSourcedBehaviorTestKit.scala
@@ -103,7 +103,7 @@ object EventSourcedBehaviorTestKit {
    * Factory method to create a new EventSourcedBehaviorTestKit.
    */
   def create[Command, Event, State](
-      system: ActorSystem[_],
+      system: ActorSystem[?],
       behavior: Behavior[Command]): EventSourcedBehaviorTestKit[Command, Event, State] =
     create(system, behavior, enabledSerializationSettings)
 
@@ -113,7 +113,7 @@ object EventSourcedBehaviorTestKit {
    * Note that `equals` must be implemented in the commands, events and state if `verifyEquality` is enabled.
    */
   def create[Command, Event, State](
-      system: ActorSystem[_],
+      system: ActorSystem[?],
       behavior: Behavior[Command],
       serializationSettings: SerializationSettings): EventSourcedBehaviorTestKit[Command, Event, State] = {
     val scaladslSettings = new scaladsl.EventSourcedBehaviorTestKit.SerializationSettings(
diff --git a/persistence-testkit/src/main/scala/org/apache/pekko/persistence/testkit/javadsl/PersistenceTestKit.scala b/persistence-testkit/src/main/scala/org/apache/pekko/persistence/testkit/javadsl/PersistenceTestKit.scala
index 4d40428156..86d526c4e4 100644
--- a/persistence-testkit/src/main/scala/org/apache/pekko/persistence/testkit/javadsl/PersistenceTestKit.scala
+++ b/persistence-testkit/src/main/scala/org/apache/pekko/persistence/testkit/javadsl/PersistenceTestKit.scala
@@ -452,6 +452,6 @@ object PersistenceTestKit {
 
   def create(system: ActorSystem): PersistenceTestKit = new PersistenceTestKit(system)
 
-  def create(system: TypedActorSystem[_]): PersistenceTestKit = create(system.classicSystem)
+  def create(system: TypedActorSystem[?]): PersistenceTestKit = create(system.classicSystem)
 
 }
diff --git a/persistence-testkit/src/main/scala/org/apache/pekko/persistence/testkit/javadsl/SnapshotTestKit.scala b/persistence-testkit/src/main/scala/org/apache/pekko/persistence/testkit/javadsl/SnapshotTestKit.scala
index 62bcccaf0b..a5bb6b703f 100644
--- a/persistence-testkit/src/main/scala/org/apache/pekko/persistence/testkit/javadsl/SnapshotTestKit.scala
+++ b/persistence-testkit/src/main/scala/org/apache/pekko/persistence/testkit/javadsl/SnapshotTestKit.scala
@@ -279,6 +279,6 @@ object SnapshotTestKit {
 
   def create(system: ActorSystem): SnapshotTestKit = new SnapshotTestKit(system)
 
-  def create(system: TypedActorSystem[_]): SnapshotTestKit = create(system.classicSystem)
+  def create(system: TypedActorSystem[?]): SnapshotTestKit = create(system.classicSystem)
 
 }
diff --git a/persistence-testkit/src/main/scala/org/apache/pekko/persistence/testkit/scaladsl/EventSourcedBehaviorTestKit.scala b/persistence-testkit/src/main/scala/org/apache/pekko/persistence/testkit/scaladsl/EventSourcedBehaviorTestKit.scala
index 65d1ef6bf9..d063c5024e 100644
--- a/persistence-testkit/src/main/scala/org/apache/pekko/persistence/testkit/scaladsl/EventSourcedBehaviorTestKit.scala
+++ b/persistence-testkit/src/main/scala/org/apache/pekko/persistence/testkit/scaladsl/EventSourcedBehaviorTestKit.scala
@@ -107,7 +107,7 @@ object EventSourcedBehaviorTestKit {
    * Factory method to create a new EventSourcedBehaviorTestKit.
    */
   def apply[Command, Event, State](
-      system: ActorSystem[_],
+      system: ActorSystem[?],
       behavior: Behavior[Command]): EventSourcedBehaviorTestKit[Command, Event, State] =
     apply(system, behavior, SerializationSettings.enabled)
 
@@ -118,7 +118,7 @@ object EventSourcedBehaviorTestKit {
    * `verifyEquality` is enabled.
    */
   def apply[Command, Event, State](
-      system: ActorSystem[_],
+      system: ActorSystem[?],
       behavior: Behavior[Command],
       serializationSettings: SerializationSettings): EventSourcedBehaviorTestKit[Command, Event, State] =
     new EventSourcedBehaviorTestKitImpl(ActorTestKit(system), behavior, serializationSettings)
diff --git a/persistence-testkit/src/main/scala/org/apache/pekko/persistence/testkit/scaladsl/PersistenceTestKit.scala b/persistence-testkit/src/main/scala/org/apache/pekko/persistence/testkit/scaladsl/PersistenceTestKit.scala
index d3f084cbe8..20ea868cf8 100644
--- a/persistence-testkit/src/main/scala/org/apache/pekko/persistence/testkit/scaladsl/PersistenceTestKit.scala
+++ b/persistence-testkit/src/main/scala/org/apache/pekko/persistence/testkit/scaladsl/PersistenceTestKit.scala
@@ -413,7 +413,7 @@ object SnapshotTestKit {
 
   def apply(implicit system: ActorSystem): SnapshotTestKit = new SnapshotTestKit(system)
 
-  def apply(implicit system: TypedActorSystem[_]): SnapshotTestKit = apply(system.classicSystem)
+  def apply(implicit system: TypedActorSystem[?]): SnapshotTestKit = apply(system.classicSystem)
 
   object Settings extends ExtensionId[Settings] {
 
diff --git a/persistence-testkit/src/main/scala/org/apache/pekko/persistence/testkit/scaladsl/TestOps.scala b/persistence-testkit/src/main/scala/org/apache/pekko/persistence/testkit/scaladsl/TestOps.scala
index 960a747688..24a61d90e6 100644
--- a/persistence-testkit/src/main/scala/org/apache/pekko/persistence/testkit/scaladsl/TestOps.scala
+++ b/persistence-testkit/src/main/scala/org/apache/pekko/persistence/testkit/scaladsl/TestOps.scala
@@ -26,7 +26,7 @@ import pekko.util
 import pekko.util.BoxedType
 
 private[testkit] trait RejectSupport[U] {
-  this: PolicyOpsTestKit[U] with HasStorage[U, _] =>
+  this: PolicyOpsTestKit[U] with HasStorage[U, ?] =>
 
   /**
    * Reject `n` following journal operations depending on the condition `cond`.
@@ -67,7 +67,7 @@ private[testkit] trait RejectSupport[U] {
 }
 
 private[testkit] trait PolicyOpsTestKit[P] {
-  this: HasStorage[P, _] =>
+  this: HasStorage[P, ?] =>
 
   private[testkit] val Policies: DefaultPolicies[P]
 
@@ -124,7 +124,7 @@ private[testkit] trait PolicyOpsTestKit[P] {
 }
 
 private[testkit] trait ExpectOps[U] {
-  this: HasStorage[_, U] =>
+  this: HasStorage[?, U] =>
 
   private[testkit] val probe: TestKitBase
 
@@ -265,7 +265,7 @@ private[testkit] trait ExpectOps[U] {
 }
 
 private[testkit] trait ClearOps {
-  this: HasStorage[_, _] =>
+  this: HasStorage[?, ?] =>
 
   /**
    * Clear all data from the storage.
@@ -294,7 +294,7 @@ private[testkit] trait ClearOps {
 }
 
 private[testkit] trait ClearPreservingSeqNums {
-  this: HasStorage[_, _] =>
+  this: HasStorage[?, ?] =>
 
   /**
    * Clear all data in the storage preserving sequence numbers.
diff --git a/persistence-typed-tests/src/test/scala/docs/org/apache/pekko/persistence/typed/ReplicatedEventSourcingCompileOnlySpec.scala b/persistence-typed-tests/src/test/scala/docs/org/apache/pekko/persistence/typed/ReplicatedEventSourcingCompileOnlySpec.scala
index 5e4215390b..bdf8ea46ac 100644
--- a/persistence-typed-tests/src/test/scala/docs/org/apache/pekko/persistence/typed/ReplicatedEventSourcingCompileOnlySpec.scala
+++ b/persistence-typed-tests/src/test/scala/docs/org/apache/pekko/persistence/typed/ReplicatedEventSourcingCompileOnlySpec.scala
@@ -40,7 +40,7 @@ object ReplicatedEventSourcingCompileOnlySpec {
   object Shared {
     // #factory-shared
     def apply(
-        system: ActorSystem[_],
+        system: ActorSystem[?],
         entityId: String,
         replicaId: ReplicaId): EventSourcedBehavior[Command, State, Event] = {
       ReplicatedEventSourcing.commonJournalConfig(
@@ -56,7 +56,7 @@ object ReplicatedEventSourcingCompileOnlySpec {
   object PerReplica {
     // #factory
     def apply(
-        system: ActorSystem[_],
+        system: ActorSystem[?],
         entityId: String,
         replicaId: ReplicaId): EventSourcedBehavior[Command, State, Event] = {
       ReplicatedEventSourcing.perReplicaJournalConfig(
diff --git a/persistence-typed-tests/src/test/scala/org/apache/pekko/persistence/typed/scaladsl/EventSourcedBehaviorReplySpec.scala b/persistence-typed-tests/src/test/scala/org/apache/pekko/persistence/typed/scaladsl/EventSourcedBehaviorReplySpec.scala
index 6ab5b4db20..80c98720c2 100644
--- a/persistence-typed-tests/src/test/scala/org/apache/pekko/persistence/typed/scaladsl/EventSourcedBehaviorReplySpec.scala
+++ b/persistence-typed-tests/src/test/scala/org/apache/pekko/persistence/typed/scaladsl/EventSourcedBehaviorReplySpec.scala
@@ -41,13 +41,13 @@ object EventSourcedBehaviorReplySpec {
 
   final case class State(value: Int, history: Vector[Int]) extends CborSerializable
 
-  def counter(persistenceId: PersistenceId): Behavior[Command[_]] =
+  def counter(persistenceId: PersistenceId): Behavior[Command[?]] =
     Behaviors.setup(ctx => counter(ctx, persistenceId))
 
   def counter(
-      ctx: ActorContext[Command[_]],
-      persistenceId: PersistenceId): EventSourcedBehavior[Command[_], Event, State] = {
-    EventSourcedBehavior.withEnforcedReplies[Command[_], Event, State](
+      ctx: ActorContext[Command[?]],
+      persistenceId: PersistenceId): EventSourcedBehavior[Command[?], Event, State] = {
+    EventSourcedBehavior.withEnforcedReplies[Command[?], Event, State](
       persistenceId,
       emptyState = State(0, Vector.empty),
       commandHandler = (state, command) =>
diff --git a/persistence-typed-tests/src/test/scala/org/apache/pekko/persistence/typed/scaladsl/EventSourcedBehaviorSpec.scala b/persistence-typed-tests/src/test/scala/org/apache/pekko/persistence/typed/scaladsl/EventSourcedBehaviorSpec.scala
index 6e3ad66614..0a65ea9645 100644
--- a/persistence-typed-tests/src/test/scala/org/apache/pekko/persistence/typed/scaladsl/EventSourcedBehaviorSpec.scala
+++ b/persistence-typed-tests/src/test/scala/org/apache/pekko/persistence/typed/scaladsl/EventSourcedBehaviorSpec.scala
@@ -131,15 +131,15 @@ object EventSourcedBehaviorSpec {
   val firstLogging = "first logging"
   val secondLogging = "second logging"
 
-  def counter(persistenceId: PersistenceId)(implicit system: ActorSystem[_]): Behavior[Command] =
+  def counter(persistenceId: PersistenceId)(implicit system: ActorSystem[?]): Behavior[Command] =
     Behaviors.setup(ctx => counter(ctx, persistenceId))
 
   def counter(persistenceId: PersistenceId, logging: ActorRef[String])(
-      implicit system: ActorSystem[_]): Behavior[Command] =
+      implicit system: ActorSystem[?]): Behavior[Command] =
     Behaviors.setup(ctx => counter(ctx, persistenceId, logging))
 
   def counter(ctx: ActorContext[Command], persistenceId: PersistenceId)(
-      implicit system: ActorSystem[_]): EventSourcedBehavior[Command, Event, State] =
+      implicit system: ActorSystem[?]): EventSourcedBehavior[Command, Event, State] =
     counter(
       ctx,
       persistenceId,
@@ -148,7 +148,7 @@ object EventSourcedBehaviorSpec {
       snapshotProbe = TestProbe[Try[SnapshotMetadata]]().ref)
 
   def counter(ctx: ActorContext[Command], persistenceId: PersistenceId, logging: ActorRef[String])(
-      implicit system: ActorSystem[_]): EventSourcedBehavior[Command, Event, State] =
+      implicit system: ActorSystem[?]): EventSourcedBehavior[Command, Event, State] =
     counter(
       ctx,
       persistenceId,
@@ -161,18 +161,18 @@ object EventSourcedBehaviorSpec {
       persistenceId: PersistenceId,
       probe: ActorRef[(State, Event)],
       snapshotProbe: ActorRef[Try[SnapshotMetadata]])(
-      implicit system: ActorSystem[_]): EventSourcedBehavior[Command, Event, State] =
+      implicit system: ActorSystem[?]): EventSourcedBehavior[Command, Event, State] =
     counter(ctx, persistenceId, TestProbe[String]().ref, probe, snapshotProbe)
 
   def counterWithProbe(ctx: ActorContext[Command], persistenceId: PersistenceId, probe: ActorRef[(State, Event)])(
-      implicit system: ActorSystem[_]): EventSourcedBehavior[Command, Event, State] =
+      implicit system: ActorSystem[?]): EventSourcedBehavior[Command, Event, State] =
     counter(ctx, persistenceId, TestProbe[String]().ref, probe, TestProbe[Try[SnapshotMetadata]]().ref)
 
   def counterWithSnapshotProbe(
       ctx: ActorContext[Command],
       persistenceId: PersistenceId,
       probe: ActorRef[Try[SnapshotMetadata]])(
-      implicit system: ActorSystem[_]): EventSourcedBehavior[Command, Event, State] =
+      implicit system: ActorSystem[?]): EventSourcedBehavior[Command, Event, State] =
     counter(ctx, persistenceId, TestProbe[String]().ref, TestProbe[(State, Event)]().ref, snapshotProbe = probe)
 
   def counter(
@@ -753,7 +753,7 @@ class EventSourcedBehaviorSpec
       firstThree ++ others should contain theSameElementsInOrderAs all
     }
 
-    def watcher(toWatch: ActorRef[_]): TestProbe[String] = {
+    def watcher(toWatch: ActorRef[?]): TestProbe[String] = {
       val probe = TestProbe[String]()
       val w = Behaviors.setup[Any] { ctx =>
         ctx.watch(toWatch)
diff --git a/persistence-typed-tests/src/test/scala/org/apache/pekko/persistence/typed/scaladsl/EventSourcedBehaviorStashSpec.scala b/persistence-typed-tests/src/test/scala/org/apache/pekko/persistence/typed/scaladsl/EventSourcedBehaviorStashSpec.scala
index dd85814d55..25477a5162 100644
--- a/persistence-typed-tests/src/test/scala/org/apache/pekko/persistence/typed/scaladsl/EventSourcedBehaviorStashSpec.scala
+++ b/persistence-typed-tests/src/test/scala/org/apache/pekko/persistence/typed/scaladsl/EventSourcedBehaviorStashSpec.scala
@@ -82,18 +82,18 @@ object EventSourcedBehaviorStashSpec {
 
   final case class State(value: Int, active: Boolean)
 
-  def counter(persistenceId: PersistenceId, signalProbe: Option[ActorRef[String]] = None): Behavior[Command[_]] =
+  def counter(persistenceId: PersistenceId, signalProbe: Option[ActorRef[String]] = None): Behavior[Command[?]] =
     Behaviors
-      .supervise[Command[_]] {
+      .supervise[Command[?]] {
         Behaviors.setup(_ => eventSourcedCounter(persistenceId, signalProbe))
       }
       .onFailure(SupervisorStrategy.restart.withLoggingEnabled(enabled = false))
 
   def eventSourcedCounter(
       persistenceId: PersistenceId,
-      signalProbe: Option[ActorRef[String]]): EventSourcedBehavior[Command[_], Event, State] = {
+      signalProbe: Option[ActorRef[String]]): EventSourcedBehavior[Command[?], Event, State] = {
     EventSourcedBehavior
-      .withEnforcedReplies[Command[_], Event, State](
+      .withEnforcedReplies[Command[?], Event, State](
         persistenceId,
         emptyState = State(0, active = true),
         commandHandler = (state, command) => {
@@ -123,7 +123,7 @@ object EventSourcedBehaviorStashSpec {
       }
   }
 
-  private def active(state: State, command: Command[_]): ReplyEffect[Event, State] = {
+  private def active(state: State, command: Command[?]): ReplyEffect[Event, State] = {
     command match {
       case Increment(id, replyTo) =>
         Effect.persist(Incremented(1)).thenReply(replyTo)(_ => Ack(id))
@@ -149,7 +149,7 @@ object EventSourcedBehaviorStashSpec {
     }
   }
 
-  private def inactive(state: State, command: Command[_]): ReplyEffect[Event, State] = {
+  private def inactive(state: State, command: Command[?]): ReplyEffect[Event, State] = {
     command match {
       case _: Increment =>
         Effect.stash()
diff --git a/persistence-typed-tests/src/test/scala/org/apache/pekko/persistence/typed/scaladsl/EventSourcedBehaviorWatchSpec.scala b/persistence-typed-tests/src/test/scala/org/apache/pekko/persistence/typed/scaladsl/EventSourcedBehaviorWatchSpec.scala
index 5556f79f12..48364c644b 100644
--- a/persistence-typed-tests/src/test/scala/org/apache/pekko/persistence/typed/scaladsl/EventSourcedBehaviorWatchSpec.scala
+++ b/persistence-typed-tests/src/test/scala/org/apache/pekko/persistence/typed/scaladsl/EventSourcedBehaviorWatchSpec.scala
@@ -46,7 +46,7 @@ object EventSourcedBehaviorWatchSpec {
   case object Fail extends Command
   case object Stop extends Command
   final case class ChildHasFailed(t: pekko.actor.typed.ChildFailed)
-  final case class HasTerminated(ref: ActorRef[_])
+  final case class HasTerminated(ref: ActorRef[?])
 }
 
 class EventSourcedBehaviorWatchSpec
@@ -67,7 +67,7 @@ class EventSourcedBehaviorWatchSpec
   private def setup(
       pf: PartialFunction[(String, Signal), Unit],
       settings: EventSourcedSettings,
-      context: ActorContext[_]): BehaviorSetup[Command, String, String] =
+      context: ActorContext[?]): BehaviorSetup[Command, String, String] =
     new BehaviorSetup[Command, String, String](
       context.asInstanceOf[ActorContext[InternalProtocol]],
       nextPid,
diff --git a/persistence-typed-tests/src/test/scala/org/apache/pekko/persistence/typed/state/scaladsl/DurableStateBehaviorReplySpec.scala b/persistence-typed-tests/src/test/scala/org/apache/pekko/persistence/typed/state/scaladsl/DurableStateBehaviorReplySpec.scala
index ecc1ceae62..109249cb23 100644
--- a/persistence-typed-tests/src/test/scala/org/apache/pekko/persistence/typed/state/scaladsl/DurableStateBehaviorReplySpec.scala
+++ b/persistence-typed-tests/src/test/scala/org/apache/pekko/persistence/typed/state/scaladsl/DurableStateBehaviorReplySpec.scala
@@ -47,11 +47,11 @@ object DurableStateBehaviorReplySpec {
 
   final case class State(value: Int) extends CborSerializable
 
-  def counter(persistenceId: PersistenceId): Behavior[Command[_]] =
+  def counter(persistenceId: PersistenceId): Behavior[Command[?]] =
     Behaviors.setup(ctx => counter(ctx, persistenceId))
 
-  def counter(ctx: ActorContext[Command[_]], persistenceId: PersistenceId): DurableStateBehavior[Command[_], State] = {
-    DurableStateBehavior.withEnforcedReplies[Command[_], State](
+  def counter(ctx: ActorContext[Command[?]], persistenceId: PersistenceId): DurableStateBehavior[Command[?], State] = {
+    DurableStateBehavior.withEnforcedReplies[Command[?], State](
       persistenceId,
       emptyState = State(0),
       commandHandler = (state, command) =>
diff --git a/persistence-typed-tests/src/test/scala/org/apache/pekko/persistence/typed/state/scaladsl/DurableStateBehaviorStashOverflowSpec.scala b/persistence-typed-tests/src/test/scala/org/apache/pekko/persistence/typed/state/scaladsl/DurableStateBehaviorStashOverflowSpec.scala
index e710612d59..64866b40c8 100644
--- a/persistence-typed-tests/src/test/scala/org/apache/pekko/persistence/typed/state/scaladsl/DurableStateBehaviorStashOverflowSpec.scala
+++ b/persistence-typed-tests/src/test/scala/org/apache/pekko/persistence/typed/state/scaladsl/DurableStateBehaviorStashOverflowSpec.scala
@@ -43,8 +43,8 @@ object DurableStateBehaviorStashOverflowSpec {
   }
 
   object TestDurableStateStorePlugin {
-    @volatile var instance: Option[TestDurableStateStorePlugin[_]] = None
-    def getInstance(): TestDurableStateStorePlugin[_] = instance.get
+    @volatile var instance: Option[TestDurableStateStorePlugin[?]] = None
+    def getInstance(): TestDurableStateStorePlugin[?] = instance.get
   }
 
   class TestDurableStateStorePlugin[A] extends DurableStateUpdateStore[A] {
diff --git a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/crdt/ORSet.scala b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/crdt/ORSet.scala
index 8bc193c9b1..938d4f7b85 100644
--- a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/crdt/ORSet.scala
+++ b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/crdt/ORSet.scala
@@ -496,7 +496,7 @@ final class ORSet[A] private[pekko] (
   override def toString: String = s"OR$elements"
 
   override def equals(o: Any): Boolean = o match {
-    case other: ORSet[_] =>
+    case other: ORSet[?] =>
       originReplica == other.originReplica && vvector == other.vvector && elementsMap == other.elementsMap
     case _ => false
   }
diff --git a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/delivery/EventSourcedProducerQueue.scala b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/delivery/EventSourcedProducerQueue.scala
index 5fc74e95be..1a94859173 100644
--- a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/delivery/EventSourcedProducerQueue.scala
+++ b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/delivery/EventSourcedProducerQueue.scala
@@ -52,7 +52,7 @@ object EventSourcedProducerQueue {
      * Scala API: Factory method from config `pekko.reliable-delivery.producer-controller.event-sourced-durable-queue`
      * of the `ActorSystem`.
      */
-    def apply(system: ActorSystem[_]): Settings =
+    def apply(system: ActorSystem[?]): Settings =
       apply(system.settings.config.getConfig("pekko.reliable-delivery.producer-controller.event-sourced-durable-queue"))
 
     /**
@@ -74,7 +74,7 @@ object EventSourcedProducerQueue {
      * Java API: Factory method from config `pekko.reliable-delivery.producer-controller.event-sourced-durable-queue`
      * of the `ActorSystem`.
      */
-    def create(system: ActorSystem[_]): Settings =
+    def create(system: ActorSystem[?]): Settings =
       apply(system)
 
     /**
@@ -274,7 +274,7 @@ private class EventSourcedProducerQueue[A](
         case LoadState(replyTo) =>
           Effect.reply(replyTo)(state)
 
-        case _: CleanupTick[_] =>
+        case _: CleanupTick[?] =>
           onCleanupTick(state)
 
         case cmd =>
@@ -307,7 +307,7 @@ private class EventSourcedProducerQueue[A](
 
   def onCommandBeforeInitialCleanup(state: State[A], command: Command[A]): Effect[Event, State[A]] = {
     command match {
-      case _: CleanupTick[_] =>
+      case _: CleanupTick[?] =>
         val old = oldUnconfirmedToCleanup(state)
         val stateWithoutPartialChunkedMessages = state.cleanupPartialChunkedMessages()
         initialCleanupDone = true
diff --git a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/internal/EventSourcedBehaviorImpl.scala b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/internal/EventSourcedBehaviorImpl.scala
index 060e10f4b2..494ee17d4a 100644
--- a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/internal/EventSourcedBehaviorImpl.scala
+++ b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/internal/EventSourcedBehaviorImpl.scala
@@ -106,7 +106,7 @@ private[pekko] final case class EventSourcedBehaviorImpl[Command, Event, State](
     emptyState: State,
     commandHandler: EventSourcedBehavior.CommandHandler[Command, Event, State],
     eventHandler: EventSourcedBehavior.EventHandler[State, Event],
-    loggerClass: Class[_],
+    loggerClass: Class[?],
     journalPluginId: Option[String] = None,
     snapshotPluginId: Option[String] = None,
     journalPluginConfig: Option[Config] = None,
@@ -135,7 +135,7 @@ private[pekko] final case class EventSourcedBehaviorImpl[Command, Event, State](
   override def apply(context: typed.TypedActorContext[Command]): Behavior[Command] = {
     val ctx = context.asScala
     val hasCustomLoggerName = ctx match {
-      case internalCtx: ActorContextImpl[_] => internalCtx.hasCustomLoggerName
+      case internalCtx: ActorContextImpl[?] => internalCtx.hasCustomLoggerName
       case _                                => false
     }
     if (!hasCustomLoggerName) ctx.setLoggerName(loggerClass)
@@ -254,7 +254,7 @@ private[pekko] final case class EventSourcedBehaviorImpl[Command, Event, State](
   }
 
   @InternalStableApi
-  private[pekko] def initialize(@nowarn("msg=never used") context: ActorContext[_]): Unit = ()
+  private[pekko] def initialize(@nowarn("msg=never used") context: ActorContext[?]): Unit = ()
 
   override def receiveSignal(
       handler: PartialFunction[(State, Signal), Unit]): EventSourcedBehavior[Command, Event, State] =
@@ -290,7 +290,7 @@ private[pekko] final case class EventSourcedBehaviorImpl[Command, Event, State](
   override def withTaggerForState(tagger: (State, Event) => Set[String]): EventSourcedBehavior[Command, Event, State] =
     copy(tagger = tagger)
 
-  override def eventAdapter(adapter: EventAdapter[Event, _]): EventSourcedBehavior[Command, Event, State] =
+  override def eventAdapter(adapter: EventAdapter[Event, ?]): EventSourcedBehavior[Command, Event, State] =
     copy(eventAdapter = adapter.asInstanceOf[EventAdapter[Event, Any]])
 
   override def snapshotAdapter(adapter: SnapshotAdapter[State]): EventSourcedBehavior[Command, Event, State] =
diff --git a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/internal/EventSourcedSettings.scala b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/internal/EventSourcedSettings.scala
index ec35f4d57d..786212d070 100644
--- a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/internal/EventSourcedSettings.scala
+++ b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/internal/EventSourcedSettings.scala
@@ -25,7 +25,7 @@ import com.typesafe.config.Config
 @InternalApi private[pekko] object EventSourcedSettings {
 
   def apply(
-      system: ActorSystem[_],
+      system: ActorSystem[?],
       journalPluginId: String,
       snapshotPluginId: String,
       customStashCapacity: Option[Int]
@@ -33,7 +33,7 @@ import com.typesafe.config.Config
     apply(system.settings.config, journalPluginId, snapshotPluginId, None, None, customStashCapacity)
 
   def apply(
-      system: ActorSystem[_],
+      system: ActorSystem[?],
       journalPluginId: String,
       snapshotPluginId: String,
       journalPluginConfig: Option[Config],
diff --git a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/internal/ExternalInteractions.scala b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/internal/ExternalInteractions.scala
index 5477ca5b67..10f8b6e497 100644
--- a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/internal/ExternalInteractions.scala
+++ b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/internal/ExternalInteractions.scala
@@ -54,7 +54,7 @@ private[pekko] trait JournalInteractions[C, E, S] {
   def setup: BehaviorSetup[C, E, S]
 
   protected def internalPersist(
-      ctx: ActorContext[_],
+      ctx: ActorContext[?],
       cmd: Any,
       state: Running.RunningState[S, C],
       event: EventOrTaggedOrReplicated,
@@ -88,12 +88,12 @@ private[pekko] trait JournalInteractions[C, E, S] {
 
   @InternalStableApi
   private[pekko] def onWriteInitiated(
-      @nowarn("msg=never used") ctx: ActorContext[_],
+      @nowarn("msg=never used") ctx: ActorContext[?],
       @nowarn("msg=never used") cmd: Any,
       @nowarn("msg=never used") repr: PersistentRepr): Unit = ()
 
   protected def internalPersistAll(
-      ctx: ActorContext[_],
+      ctx: ActorContext[?],
       cmd: Any,
       state: Running.RunningState[S, C],
       events: immutable.Seq[EventToPersist]): Running.RunningState[S, C] = {
@@ -129,7 +129,7 @@ private[pekko] trait JournalInteractions[C, E, S] {
 
   @InternalStableApi
   private[pekko] def onWritesInitiated(
-      @nowarn("msg=never used") ctx: ActorContext[_],
+      @nowarn("msg=never used") ctx: ActorContext[?],
       @nowarn("msg=never used") cmd: Any,
       @nowarn("msg=never used") repr: immutable.Seq[PersistentRepr]): Unit = ()
 
diff --git a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/internal/ReplayingEvents.scala b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/internal/ReplayingEvents.scala
index 74fc40f86c..db902d9bb6 100644
--- a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/internal/ReplayingEvents.scala
+++ b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/internal/ReplayingEvents.scala
@@ -97,11 +97,11 @@ private[pekko] final class ReplayingEvents[C, E, S](
   onRecoveryStart(setup.context)
 
   @InternalStableApi
-  def onRecoveryStart(@nowarn("msg=never used") context: ActorContext[_]): Unit = ()
+  def onRecoveryStart(@nowarn("msg=never used") context: ActorContext[?]): Unit = ()
   @InternalStableApi
-  def onRecoveryComplete(@nowarn("msg=never used") context: ActorContext[_]): Unit = ()
+  def onRecoveryComplete(@nowarn("msg=never used") context: ActorContext[?]): Unit = ()
   @InternalStableApi
-  def onRecoveryFailed(@nowarn("msg=never used") context: ActorContext[_], @nowarn("msg=never used") reason: Throwable,
+  def onRecoveryFailed(@nowarn("msg=never used") context: ActorContext[?], @nowarn("msg=never used") reason: Throwable,
       @nowarn("msg=never used") event: Option[Any]): Unit =
     ()
 
@@ -205,7 +205,7 @@ private[pekko] final class ReplayingEvents[C, E, S](
           Behaviors.unhandled
       }
     } catch {
-      case ex: UnstashException[_] =>
+      case ex: UnstashException[?] =>
         // let supervisor handle it, don't treat it as recovery failure
         throw ex
       case NonFatal(cause) =>
diff --git a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/internal/ReplayingSnapshot.scala b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/internal/ReplayingSnapshot.scala
index 8dc7bd71e1..2134262541 100644
--- a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/internal/ReplayingSnapshot.scala
+++ b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/internal/ReplayingSnapshot.scala
@@ -120,9 +120,9 @@ private[pekko] class ReplayingSnapshot[C, E, S](override val setup: BehaviorSetu
   }
 
   @InternalStableApi
-  def onRecoveryStart(@nowarn("msg=never used") context: ActorContext[_]): Unit = ()
+  def onRecoveryStart(@nowarn("msg=never used") context: ActorContext[?]): Unit = ()
   @InternalStableApi
-  def onRecoveryFailed(@nowarn("msg=never used") context: ActorContext[_], @nowarn("msg=never used") reason: Throwable)
+  def onRecoveryFailed(@nowarn("msg=never used") context: ActorContext[?], @nowarn("msg=never used") reason: Throwable)
       : Unit = ()
 
   private def onRecoveryTick(snapshot: Boolean): Behavior[InternalProtocol] =
diff --git a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/internal/RequestingRecoveryPermit.scala b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/internal/RequestingRecoveryPermit.scala
index eddad5da65..4f00e28cfe 100644
--- a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/internal/RequestingRecoveryPermit.scala
+++ b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/internal/RequestingRecoveryPermit.scala
@@ -79,7 +79,7 @@ private[pekko] class RequestingRecoveryPermit[C, E, S](override val setup: Behav
   }
 
   @InternalStableApi
-  def onRequestingRecoveryPermit(@nowarn("msg=never used") context: ActorContext[_]): Unit = ()
+  def onRequestingRecoveryPermit(@nowarn("msg=never used") context: ActorContext[?]): Unit = ()
 
   private def becomeReplaying(receivedPoisonPill: Boolean): Behavior[InternalProtocol] = {
     setup.internalLogger.debug(s"Initializing snapshot recovery: {}", setup.recovery)
diff --git a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/internal/Running.scala b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/internal/Running.scala
index e2c88ee1ab..0b8f4bd342 100644
--- a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/internal/Running.scala
+++ b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/internal/Running.scala
@@ -262,7 +262,7 @@ private[pekko] object Running {
 
     _currentSequenceNumber = state.seqNr
 
-    private def alreadySeen(e: ReplicatedEvent[_]): Boolean = {
+    private def alreadySeen(e: ReplicatedEvent[?]): Boolean = {
       e.originSequenceNr <= state.seenPerReplica.getOrElse(e.originReplica, 0L)
     }
 
@@ -665,7 +665,7 @@ private[pekko] object Running {
         state: RunningState[S, C],
         effect: Effect[E, S],
         sideEffects: immutable.Seq[SideEffect[S]] = Nil): (Behavior[InternalProtocol], Boolean) = {
-      if (setup.internalLogger.isDebugEnabled && !effect.isInstanceOf[CompositeEffect[_, _]])
+      if (setup.internalLogger.isDebugEnabled && !effect.isInstanceOf[CompositeEffect[?, ?]])
         setup.internalLogger.debugN(
           s"Handled command [{}], resulting effect: [{}], side effects: [{}]",
           msg.getClass.getName,
@@ -1036,7 +1036,7 @@ private[pekko] object Running {
         unstashAll()
         behavior
 
-      case callback: Callback[_] =>
+      case callback: Callback[?] =>
         callback.sideEffect(state.state)
         behavior
     }
@@ -1110,18 +1110,18 @@ private[pekko] object Running {
 
   @InternalStableApi
   private[pekko] def onWriteFailed(
-      @nowarn("msg=never used") ctx: ActorContext[_],
+      @nowarn("msg=never used") ctx: ActorContext[?],
       @nowarn("msg=never used") reason: Throwable,
       @nowarn("msg=never used") event: PersistentRepr): Unit = ()
   @InternalStableApi
   private[pekko] def onWriteRejected(
-      @nowarn("msg=never used") ctx: ActorContext[_],
+      @nowarn("msg=never used") ctx: ActorContext[?],
       @nowarn("msg=never used") reason: Throwable,
       @nowarn("msg=never used") event: PersistentRepr): Unit = ()
   @InternalStableApi
-  private[pekko] def onWriteSuccess(@nowarn("msg=never used") ctx: ActorContext[_],
+  private[pekko] def onWriteSuccess(@nowarn("msg=never used") ctx: ActorContext[?],
       @nowarn("msg=never used") event: PersistentRepr): Unit = ()
   @InternalStableApi
-  private[pekko] def onWriteDone(@nowarn("msg=never used") ctx: ActorContext[_],
+  private[pekko] def onWriteDone(@nowarn("msg=never used") ctx: ActorContext[?],
       @nowarn("msg=never used") event: PersistentRepr): Unit = ()
 }
diff --git a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/javadsl/EventSourcedBehavior.scala b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/javadsl/EventSourcedBehavior.scala
index 811ea8465e..a653d24278 100644
--- a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/javadsl/EventSourcedBehavior.scala
+++ b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/javadsl/EventSourcedBehavior.scala
@@ -196,7 +196,7 @@ abstract class EventSourcedBehavior[Command, Event, State] private[pekko] (
    * Transform the event in another type before giving to the journal. Can be used to wrap events
    * in types Journals understand but is of a different type than `Event`.
    */
-  def eventAdapter(): EventAdapter[Event, _] = NoOpEventAdapter.instance[Event]
+  def eventAdapter(): EventAdapter[Event, ?] = NoOpEventAdapter.instance[Event]
 
   /**
    * Transform the state into another type before giving it to and from the journal. Can be used
@@ -264,7 +264,7 @@ abstract class EventSourcedBehavior[Command, Event, State] private[pekko] (
   /**
    * The last sequence number that was persisted, can only be called from inside the handlers of an `EventSourcedBehavior`
    */
-  final def lastSequenceNumber(ctx: ActorContext[_]): Long = {
+  final def lastSequenceNumber(ctx: ActorContext[?]): Long = {
     scaladsl.EventSourcedBehavior.lastSequenceNumber(ctx.asScala)
   }
 
diff --git a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/scaladsl/EventSourcedBehavior.scala b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/scaladsl/EventSourcedBehavior.scala
index 23184348ff..c6dd56cbd0 100644
--- a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/scaladsl/EventSourcedBehavior.scala
+++ b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/scaladsl/EventSourcedBehavior.scala
@@ -53,7 +53,7 @@ object EventSourcedBehavior {
    */
   type EventHandler[State, Event] = (State, Event) => State
 
-  private val logPrefixSkipList = classOf[EventSourcedBehavior[_, _, _]].getName :: Nil
+  private val logPrefixSkipList = classOf[EventSourcedBehavior[?, ?, ?]].getName :: Nil
 
   /**
    * Create a `Behavior` for a persistent actor.
@@ -68,7 +68,7 @@ object EventSourcedBehavior {
       emptyState: State,
       commandHandler: (State, Command) => Effect[Event, State],
       eventHandler: (State, Event) => State): EventSourcedBehavior[Command, Event, State] = {
-    val loggerClass = LoggerClass.detectLoggerClassFromStack(classOf[EventSourcedBehavior[_, _, _]], logPrefixSkipList)
+    val loggerClass = LoggerClass.detectLoggerClassFromStack(classOf[EventSourcedBehavior[?, ?, ?]], logPrefixSkipList)
     EventSourcedBehaviorImpl(persistenceId, emptyState, commandHandler, eventHandler, loggerClass)
   }
 
@@ -82,7 +82,7 @@ object EventSourcedBehavior {
       emptyState: State,
       commandHandler: (State, Command) => ReplyEffect[Event, State],
       eventHandler: (State, Event) => State): EventSourcedBehavior[Command, Event, State] = {
-    val loggerClass = LoggerClass.detectLoggerClassFromStack(classOf[EventSourcedBehavior[_, _, _]], logPrefixSkipList)
+    val loggerClass = LoggerClass.detectLoggerClassFromStack(classOf[EventSourcedBehavior[?, ?, ?]], logPrefixSkipList)
     EventSourcedBehaviorImpl(persistenceId, emptyState, commandHandler, eventHandler, loggerClass)
   }
 
@@ -113,11 +113,11 @@ object EventSourcedBehavior {
   /**
    * The last sequence number that was persisted, can only be called from inside the handlers of an `EventSourcedBehavior`
    */
-  def lastSequenceNumber(context: ActorContext[_]): Long = {
+  def lastSequenceNumber(context: ActorContext[?]): Long = {
     @tailrec
-    def extractConcreteBehavior(beh: Behavior[_]): Behavior[_] =
+    def extractConcreteBehavior(beh: Behavior[?]): Behavior[?] =
       beh match {
-        case interceptor: InterceptorImpl[_, _] => extractConcreteBehavior(interceptor.nestedBehavior)
+        case interceptor: InterceptorImpl[?, ?] => extractConcreteBehavior(interceptor.nestedBehavior)
         case concrete                           => concrete
       }
 
@@ -215,7 +215,7 @@ object EventSourcedBehavior {
    * Transform the event to another type before giving to the journal. Can be used to wrap events
    * in types Journals understand but is of a different type than `Event`.
    */
-  def eventAdapter(adapter: EventAdapter[Event, _]): EventSourcedBehavior[Command, Event, State]
+  def eventAdapter(adapter: EventAdapter[Event, ?]): EventSourcedBehavior[Command, Event, State]
 
   /**
    * Transform the state to another type before giving to the journal. Can be used to transform older
diff --git a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/serialization/ReplicatedEventSourcingSerializer.scala b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/serialization/ReplicatedEventSourcingSerializer.scala
index fbf3b650ef..f4c30fa1a3 100644
--- a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/serialization/ReplicatedEventSourcingSerializer.scala
+++ b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/serialization/ReplicatedEventSourcingSerializer.scala
@@ -97,11 +97,11 @@ import pekko.serialization.{ BaseSerializer, SerializerWithStringManifest }
   private val PublishedEventManifest = "PA"
 
   def manifest(o: AnyRef) = o match {
-    case _: ORSet[_]                  => ORSetManifest
-    case _: ORSet.AddDeltaOp[_]       => ORSetAddManifest
-    case _: ORSet.RemoveDeltaOp[_]    => ORSetRemoveManifest
-    case _: ORSet.DeltaGroup[_]       => ORSetDeltaGroupManifest
-    case _: ORSet.FullStateDeltaOp[_] => ORSetFullManifest
+    case _: ORSet[?]                  => ORSetManifest
+    case _: ORSet.AddDeltaOp[?]       => ORSetAddManifest
+    case _: ORSet.RemoveDeltaOp[?]    => ORSetRemoveManifest
+    case _: ORSet.DeltaGroup[?]       => ORSetDeltaGroupManifest
+    case _: ORSet.FullStateDeltaOp[?] => ORSetFullManifest
 
     case _: Counter         => CrdtCounterManifest
     case _: Counter.Updated => CrdtCounterUpdatedManifest
@@ -122,11 +122,11 @@ import pekko.serialization.{ BaseSerializer, SerializerWithStringManifest }
 
     case m: VersionVector => versionVectorToProto(m).toByteArray
 
-    case m: ORSet[_]                  => orsetToProto(m).toByteArray
-    case m: ORSet.AddDeltaOp[_]       => orsetToProto(m.underlying).toByteArray
-    case m: ORSet.RemoveDeltaOp[_]    => orsetToProto(m.underlying).toByteArray
-    case m: ORSet.DeltaGroup[_]       => orsetDeltaGroupToProto(m).toByteArray
-    case m: ORSet.FullStateDeltaOp[_] => orsetToProto(m.underlying).toByteArray
+    case m: ORSet[?]                  => orsetToProto(m).toByteArray
+    case m: ORSet.AddDeltaOp[?]       => orsetToProto(m.underlying).toByteArray
+    case m: ORSet.RemoveDeltaOp[?]    => orsetToProto(m.underlying).toByteArray
+    case m: ORSet.DeltaGroup[?]       => orsetDeltaGroupToProto(m).toByteArray
+    case m: ORSet.FullStateDeltaOp[?] => orsetToProto(m.underlying).toByteArray
 
     case m: Counter         => counterToProtoByteArray(m)
     case m: Counter.Updated => counterUpdatedToProtoBufByteArray(m)
@@ -225,7 +225,7 @@ import pekko.serialization.{ BaseSerializer, SerializerWithStringManifest }
       .build()
       .toByteArray
 
-  def orsetToProto(orset: ORSet[_]): ReplicatedEventSourcing.ORSet =
+  def orsetToProto(orset: ORSet[?]): ReplicatedEventSourcing.ORSet =
     orsetToProtoImpl(orset.asInstanceOf[ORSet[Any]])
 
   private def orsetToProtoImpl(orset: ORSet[Any]): ReplicatedEventSourcing.ORSet = {
@@ -251,7 +251,7 @@ import pekko.serialization.{ BaseSerializer, SerializerWithStringManifest }
         otherElementsMap = otherElementsMap.updated(enclosedMsg, other)
     }
 
-    def addDots(elements: ArrayList[_]): Unit = {
+    def addDots(elements: ArrayList[?]): Unit = {
       // add corresponding dots in same order
       val iter = elements.iterator
       while (iter.hasNext) {
@@ -326,8 +326,8 @@ import pekko.serialization.{ BaseSerializer, SerializerWithStringManifest }
   private def orsetFullFromBinary(bytes: Array[Byte]): ORSet.FullStateDeltaOp[Any] =
     new ORSet.FullStateDeltaOp(orsetFromProto(ReplicatedEventSourcing.ORSet.parseFrom(bytes)))
 
-  private def orsetDeltaGroupToProto(deltaGroup: ORSet.DeltaGroup[_]): ReplicatedEventSourcing.ORSetDeltaGroup = {
-    def createEntry(opType: ReplicatedEventSourcing.ORSetDeltaOp, u: ORSet[_]) = {
+  private def orsetDeltaGroupToProto(deltaGroup: ORSet.DeltaGroup[?]): ReplicatedEventSourcing.ORSetDeltaGroup = {
+    def createEntry(opType: ReplicatedEventSourcing.ORSetDeltaOp, u: ORSet[?]) = {
       ReplicatedEventSourcing.ORSetDeltaGroup.Entry.newBuilder().setOperation(opType).setUnderlying(orsetToProto(u))
     }
 
diff --git a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/state/internal/DurableStateBehaviorImpl.scala b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/state/internal/DurableStateBehaviorImpl.scala
index cbdd670194..65061dffe7 100644
--- a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/state/internal/DurableStateBehaviorImpl.scala
+++ b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/state/internal/DurableStateBehaviorImpl.scala
@@ -58,7 +58,7 @@ private[pekko] final case class DurableStateBehaviorImpl[Command, State](
     persistenceId: PersistenceId,
     emptyState: State,
     commandHandler: DurableStateBehavior.CommandHandler[Command, State],
-    loggerClass: Class[_],
+    loggerClass: Class[?],
     durableStateStorePluginId: Option[String] = None,
     tag: String = "",
     snapshotAdapter: SnapshotAdapter[State] = NoOpSnapshotAdapter.instance[State],
@@ -76,7 +76,7 @@ private[pekko] final case class DurableStateBehaviorImpl[Command, State](
   override def apply(context: typed.TypedActorContext[Command]): Behavior[Command] = {
     val ctx = context.asScala
     val hasCustomLoggerName = ctx match {
-      case internalCtx: ActorContextImpl[_] => internalCtx.hasCustomLoggerName
+      case internalCtx: ActorContextImpl[?] => internalCtx.hasCustomLoggerName
       case _                                => false
     }
     if (!hasCustomLoggerName) ctx.setLoggerName(loggerClass)
@@ -160,7 +160,7 @@ private[pekko] final case class DurableStateBehaviorImpl[Command, State](
   }
 
   @InternalStableApi
-  private[pekko] def initialize(@nowarn("msg=never used") context: ActorContext[_]): Unit = ()
+  private[pekko] def initialize(@nowarn("msg=never used") context: ActorContext[?]): Unit = ()
 
   override def receiveSignal(handler: PartialFunction[(State, Signal), Unit]): DurableStateBehavior[Command, State] =
     copy(signalHandler = handler)
diff --git a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/state/internal/DurableStateSettings.scala b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/state/internal/DurableStateSettings.scala
index 442e1e0903..33082fcb3d 100644
--- a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/state/internal/DurableStateSettings.scala
+++ b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/state/internal/DurableStateSettings.scala
@@ -31,7 +31,7 @@ import com.typesafe.config.Config
 @InternalApi private[pekko] object DurableStateSettings {
 
   def apply(
-      system: ActorSystem[_],
+      system: ActorSystem[?],
       durableStateStorePluginId: String,
       customStashCapacity: Option[Int]): DurableStateSettings =
     apply(system.settings.config, durableStateStorePluginId, customStashCapacity)
diff --git a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/state/internal/DurableStateStoreInteractions.scala b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/state/internal/DurableStateStoreInteractions.scala
index dcd52ff68a..18b75e6416 100644
--- a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/state/internal/DurableStateStoreInteractions.scala
+++ b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/state/internal/DurableStateStoreInteractions.scala
@@ -86,7 +86,7 @@ private[pekko] trait DurableStateStoreInteractions[C, S] {
 
   // TODO These hook methods are for Telemetry. What more parameters are needed? persistenceId?
   @InternalStableApi
-  private[pekko] def onWriteInitiated(@nowarn("msg=never used") ctx: ActorContext[_],
+  private[pekko] def onWriteInitiated(@nowarn("msg=never used") ctx: ActorContext[?],
       @nowarn("msg=never used") cmd: Any): Unit = ()
 
   protected def requestRecoveryPermit(): Unit = {
diff --git a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/state/internal/Recovering.scala b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/state/internal/Recovering.scala
index 016282d796..a81a666899 100644
--- a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/state/internal/Recovering.scala
+++ b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/state/internal/Recovering.scala
@@ -136,11 +136,11 @@ private[pekko] class Recovering[C, S](
   }
 
   @InternalStableApi
-  def onRecoveryStart(@nowarn("msg=never used") context: ActorContext[_]): Unit = ()
+  def onRecoveryStart(@nowarn("msg=never used") context: ActorContext[?]): Unit = ()
   @InternalStableApi
-  def onRecoveryComplete(@nowarn("msg=never used") context: ActorContext[_]): Unit = ()
+  def onRecoveryComplete(@nowarn("msg=never used") context: ActorContext[?]): Unit = ()
   @InternalStableApi
-  def onRecoveryFailed(@nowarn("msg=never used") context: ActorContext[_], @nowarn("msg=never used") reason: Throwable)
+  def onRecoveryFailed(@nowarn("msg=never used") context: ActorContext[?], @nowarn("msg=never used") reason: Throwable)
       : Unit = ()
 
   private def onRecoveryTimeout(): Behavior[InternalProtocol] = {
diff --git a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/state/internal/RequestingRecoveryPermit.scala b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/state/internal/RequestingRecoveryPermit.scala
index 9ae4282900..3bae69c202 100644
--- a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/state/internal/RequestingRecoveryPermit.scala
+++ b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/state/internal/RequestingRecoveryPermit.scala
@@ -78,7 +78,7 @@ private[pekko] class RequestingRecoveryPermit[C, S](override val setup: Behavior
   }
 
   @InternalStableApi
-  def onRequestingRecoveryPermit(@nowarn("msg=never used") context: ActorContext[_]): Unit = ()
+  def onRequestingRecoveryPermit(@nowarn("msg=never used") context: ActorContext[?]): Unit = ()
 
   private def becomeRecovering(receivedPoisonPill: Boolean): Behavior[InternalProtocol] = {
     setup.internalLogger.debug(s"Initializing recovery")
diff --git a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/state/internal/Running.scala b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/state/internal/Running.scala
index 4a3f73bad8..7d8d005acf 100644
--- a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/state/internal/Running.scala
+++ b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/state/internal/Running.scala
@@ -210,7 +210,7 @@ private[pekko] object Running {
         state: RunningState[S, C],
         effect: Effect[S],
         sideEffects: immutable.Seq[SideEffect[S]] = Nil): (Behavior[InternalProtocol], Boolean) = {
-      if (setup.internalLogger.isDebugEnabled && !effect.isInstanceOf[CompositeEffect[_]])
+      if (setup.internalLogger.isDebugEnabled && !effect.isInstanceOf[CompositeEffect[?]])
         setup.internalLogger.debugN(
           s"Handled command [{}], resulting effect: [{}], side effects: [{}]",
           msg.getClass.getName,
@@ -228,7 +228,7 @@ private[pekko] object Running {
         case _: PersistNothing.type =>
           (applySideEffects(sideEffects, state), true)
 
-        case _: Delete[_] =>
+        case _: Delete[?] =>
           handleDelete(msg, sideEffects)
 
         case _: Unhandled.type =>
@@ -284,7 +284,7 @@ private[pekko] object Running {
         case DeleteFailure(exc)                => onDeleteFailed(exc)
         case RecoveryTimeout                   => Behaviors.unhandled
         case RecoveryPermitGranted             => Behaviors.unhandled
-        case _: GetSuccess[_]                  => Behaviors.unhandled
+        case _: GetSuccess[?]                  => Behaviors.unhandled
         case _: GetFailure                     => Behaviors.unhandled
       }
     }
@@ -381,16 +381,16 @@ private[pekko] object Running {
         unstashAll()
         behavior
 
-      case callback: Callback[_] =>
+      case callback: Callback[?] =>
         callback.sideEffect(state.state)
         behavior
     }
   }
 
   @InternalStableApi
-  private[pekko] def onWriteFailed(@nowarn("msg=never used") ctx: ActorContext[_],
+  private[pekko] def onWriteFailed(@nowarn("msg=never used") ctx: ActorContext[?],
       @nowarn("msg=never used") reason: Throwable): Unit = ()
   @InternalStableApi
-  private[pekko] def onWriteSuccess(@nowarn("msg=never used") ctx: ActorContext[_]): Unit = ()
+  private[pekko] def onWriteSuccess(@nowarn("msg=never used") ctx: ActorContext[?]): Unit = ()
 
 }
diff --git a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/state/javadsl/DurableStateBehavior.scala b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/state/javadsl/DurableStateBehavior.scala
index 90f9325350..54b3b6003a 100644
--- a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/state/javadsl/DurableStateBehavior.scala
+++ b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/state/javadsl/DurableStateBehavior.scala
@@ -156,7 +156,7 @@ abstract class DurableStateBehavior[Command, State] private[pekko] (
   /**
    * The last sequence number that was persisted, can only be called from inside the handlers of a `DurableStateBehavior`
    */
-  final def lastSequenceNumber(ctx: ActorContext[_]): Long = {
+  final def lastSequenceNumber(ctx: ActorContext[?]): Long = {
     scaladsl.DurableStateBehavior.lastSequenceNumber(ctx.asScala)
   }
 
diff --git a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/state/scaladsl/DurableStateBehavior.scala b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/state/scaladsl/DurableStateBehavior.scala
index 2de01499d7..ec44f3abfa 100644
--- a/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/state/scaladsl/DurableStateBehavior.scala
+++ b/persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/state/scaladsl/DurableStateBehavior.scala
@@ -44,7 +44,7 @@ object DurableStateBehavior {
    */
   type CommandHandler[Command, State] = (State, Command) => Effect[State]
 
-  private val logPrefixSkipList = classOf[DurableStateBehavior[_, _]].getName :: Nil
+  private val logPrefixSkipList = classOf[DurableStateBehavior[?, ?]].getName :: Nil
 
   /**
    * Create a `Behavior` for a persistent actor with durable storage of its state.
@@ -57,7 +57,7 @@ object DurableStateBehavior {
       persistenceId: PersistenceId,
       emptyState: State,
       commandHandler: (State, Command) => Effect[State]): DurableStateBehavior[Command, State] = {
-    val loggerClass = LoggerClass.detectLoggerClassFromStack(classOf[DurableStateBehavior[_, _]], logPrefixSkipList)
+    val loggerClass = LoggerClass.detectLoggerClassFromStack(classOf[DurableStateBehavior[?, ?]], logPrefixSkipList)
     DurableStateBehaviorImpl(persistenceId, emptyState, commandHandler, loggerClass)
   }
 
@@ -70,7 +70,7 @@ object DurableStateBehavior {
       persistenceId: PersistenceId,
       emptyState: State,
       commandHandler: (State, Command) => ReplyEffect[State]): DurableStateBehavior[Command, State] = {
-    val loggerClass = LoggerClass.detectLoggerClassFromStack(classOf[DurableStateBehavior[_, _]], logPrefixSkipList)
+    val loggerClass = LoggerClass.detectLoggerClassFromStack(classOf[DurableStateBehavior[?, ?]], logPrefixSkipList)
     DurableStateBehaviorImpl(persistenceId, emptyState, commandHandler, loggerClass)
   }
 
@@ -100,11 +100,11 @@ object DurableStateBehavior {
   /**
    * The last sequence number that was persisted, can only be called from inside the handlers of a `DurableStateBehavior`
    */
-  def lastSequenceNumber(context: ActorContext[_]): Long = {
+  def lastSequenceNumber(context: ActorContext[?]): Long = {
     @tailrec
-    def extractConcreteBehavior(beh: Behavior[_]): Behavior[_] =
+    def extractConcreteBehavior(beh: Behavior[?]): Behavior[?] =
       beh match {
-        case interceptor: InterceptorImpl[_, _] => extractConcreteBehavior(interceptor.nestedBehavior)
+        case interceptor: InterceptorImpl[?, ?] => extractConcreteBehavior(interceptor.nestedBehavior)
         case concrete                           => concrete
       }
 
diff --git a/persistence-typed/src/test/scala/docs/org/apache/pekko/persistence/typed/DurableStatePersistentBehaviorCompileOnly.scala b/persistence-typed/src/test/scala/docs/org/apache/pekko/persistence/typed/DurableStatePersistentBehaviorCompileOnly.scala
index d481e1029a..bf22675da3 100644
--- a/persistence-typed/src/test/scala/docs/org/apache/pekko/persistence/typed/DurableStatePersistentBehaviorCompileOnly.scala
+++ b/persistence-typed/src/test/scala/docs/org/apache/pekko/persistence/typed/DurableStatePersistentBehaviorCompileOnly.scala
@@ -51,7 +51,7 @@ object DurableStatePersistentBehaviorCompileOnly {
     // #command-handler
     import pekko.persistence.typed.state.scaladsl.Effect
 
-    val commandHandler: (State, Command[_]) => Effect[State] = (state, command) =>
+    val commandHandler: (State, Command[?]) => Effect[State] = (state, command) =>
       command match {
         case Increment         => Effect.persist(state.copy(value = state.value + 1))
         case IncrementBy(by)   => Effect.persist(state.copy(value = state.value + by))
@@ -61,8 +61,8 @@ object DurableStatePersistentBehaviorCompileOnly {
     // #command-handler
 
     // #behavior
-    def counter(id: String): DurableStateBehavior[Command[_], State] = {
-      DurableStateBehavior.apply[Command[_], State](
+    def counter(id: String): DurableStateBehavior[Command[?], State] = {
+      DurableStateBehavior.apply[Command[?], State](
         persistenceId = PersistenceId.ofUniqueId(id),
         emptyState = State(0),
         commandHandler = commandHandler)
@@ -76,8 +76,8 @@ object DurableStatePersistentBehaviorCompileOnly {
 
     final case class State(value: Int) extends CborSerializable
 
-    def counter(persistenceId: PersistenceId): DurableStateBehavior[Command[_], State] = {
-      DurableStateBehavior.apply[Command[_], State](
+    def counter(persistenceId: PersistenceId): DurableStateBehavior[Command[?], State] = {
+      DurableStateBehavior.apply[Command[?], State](
         persistenceId,
         emptyState = State(0),
         commandHandler =
@@ -97,8 +97,8 @@ object DurableStatePersistentBehaviorCompileOnly {
 
     final case class State(value: Int) extends CborSerializable
 
-    def counter(persistenceId: PersistenceId): DurableStateBehavior[Command[_], State] = {
-      DurableStateBehavior.withEnforcedReplies[Command[_], State](
+    def counter(persistenceId: PersistenceId): DurableStateBehavior[Command[?], State] = {
+      DurableStateBehavior.withEnforcedReplies[Command[?], State](
         persistenceId,
         emptyState = State(0),
         commandHandler = (state, command) =>
@@ -134,9 +134,9 @@ object DurableStatePersistentBehaviorCompileOnly {
   }
 
   object TaggingBehavior {
-    def apply(): Behavior[Command[_]] =
+    def apply(): Behavior[Command[?]] =
       // #tagging
-      DurableStateBehavior[Command[_], State](
+      DurableStateBehavior[Command[?], State](
         persistenceId = PersistenceId.ofUniqueId("abc"),
         emptyState = State(0),
         commandHandler = (state, cmd) => throw new NotImplementedError("TODO: process the command & return an Effect"))
@@ -148,10 +148,10 @@ object DurableStatePersistentBehaviorCompileOnly {
     import pekko.persistence.typed.state.scaladsl.Effect
     import pekko.persistence.typed.state.scaladsl.DurableStateBehavior.CommandHandler
 
-    def apply(): Behavior[Command[_]] =
+    def apply(): Behavior[Command[?]] =
       // #wrapPersistentBehavior
-      Behaviors.setup[Command[_]] { context =>
-        DurableStateBehavior[Command[_], State](
+      Behaviors.setup[Command[?]] { context =>
+        DurableStateBehavior[Command[?], State](
           persistenceId = PersistenceId.ofUniqueId("abc"),
           emptyState = State(0),
           commandHandler = CommandHandler.command { cmd =>
diff --git a/persistence-typed/src/test/scala/org/apache/pekko/persistence/typed/StashingWhenSnapshottingSpec.scala b/persistence-typed/src/test/scala/org/apache/pekko/persistence/typed/StashingWhenSnapshottingSpec.scala
index 404746b9b3..a47d75b3ce 100644
--- a/persistence-typed/src/test/scala/org/apache/pekko/persistence/typed/StashingWhenSnapshottingSpec.scala
+++ b/persistence-typed/src/test/scala/org/apache/pekko/persistence/typed/StashingWhenSnapshottingSpec.scala
@@ -41,7 +41,7 @@ import com.typesafe.config.ConfigFactory
 object StashingWhenSnapshottingSpec {
   object ControllableSnapshotStoreExt extends ExtensionId[ControllableSnapshotStoreExt] {
 
-    override def createExtension(system: ActorSystem[_]): ControllableSnapshotStoreExt =
+    override def createExtension(system: ActorSystem[?]): ControllableSnapshotStoreExt =
       new ControllableSnapshotStoreExt()
   }
 
diff --git a/persistence-typed/src/test/scala/org/apache/pekko/persistence/typed/internal/StashStateSpec.scala b/persistence-typed/src/test/scala/org/apache/pekko/persistence/typed/internal/StashStateSpec.scala
index 3695d9692d..63faa0aae3 100644
--- a/persistence-typed/src/test/scala/org/apache/pekko/persistence/typed/internal/StashStateSpec.scala
+++ b/persistence-typed/src/test/scala/org/apache/pekko/persistence/typed/internal/StashStateSpec.scala
@@ -58,7 +58,7 @@ class StashStateSpec extends ScalaTestWithActorTestKit with AnyWordSpecLike with
               stashState.internalStashBuffer.stash(RecoveryPermitGranted)
               probe.ref ! stashState.internalStashBuffer.size
               Behaviors.same[InternalProtocol]
-            case _: IncomingCommand[_] => Behaviors.stopped
+            case _: IncomingCommand[?] => Behaviors.stopped
           }
           .receiveSignal {
             case (_, _) =>
diff --git a/persistence-typed/src/test/scala/org/apache/pekko/persistence/typed/scaladsl/PersistentActorCompileOnlyTest.scala b/persistence-typed/src/test/scala/org/apache/pekko/persistence/typed/scaladsl/PersistentActorCompileOnlyTest.scala
index a7d7638964..6dab33570f 100644
--- a/persistence-typed/src/test/scala/org/apache/pekko/persistence/typed/scaladsl/PersistentActorCompileOnlyTest.scala
+++ b/persistence-typed/src/test/scala/org/apache/pekko/persistence/typed/scaladsl/PersistentActorCompileOnlyTest.scala
@@ -76,7 +76,7 @@ object PersistentActorCompileOnlyTest {
     def performSideEffect(sender: ActorRef[AcknowledgeSideEffect], correlationId: Int, data: String): Unit = {
       import pekko.actor.typed.scaladsl.AskPattern._
       implicit val timeout: pekko.util.Timeout = 1.second
-      implicit val system: ActorSystem[_] = ???
+      implicit val system: ActorSystem[?] = ???
       implicit val ec: ExecutionContext = ???
 
       val response: Future[RecoveryComplete.Response] =
diff --git a/persistence/src/main/scala-2/org/apache/pekko/persistence/TraitOrder.scala b/persistence/src/main/scala-2/org/apache/pekko/persistence/TraitOrder.scala
index 75ccd19c30..aa0854ad20 100644
--- a/persistence/src/main/scala-2/org/apache/pekko/persistence/TraitOrder.scala
+++ b/persistence/src/main/scala-2/org/apache/pekko/persistence/TraitOrder.scala
@@ -22,7 +22,7 @@ import org.apache.pekko.annotation.InternalApi
 private[persistence] object TraitOrder {
   val canBeChecked = true
 
-  def checkBefore(clazz: Class[_], one: Class[_], other: Class[_]): Unit = {
+  def checkBefore(clazz: Class[?], one: Class[?], other: Class[?]): Unit = {
     val interfaces = clazz.getInterfaces
     val i = interfaces.indexOf(other)
     val j = interfaces.indexOf(one)
diff --git a/persistence/src/main/scala-3/org/apache/pekko/persistence/TraitOrder.scala b/persistence/src/main/scala-3/org/apache/pekko/persistence/TraitOrder.scala
index d347e7ca82..a45b43c8f1 100644
--- a/persistence/src/main/scala-3/org/apache/pekko/persistence/TraitOrder.scala
+++ b/persistence/src/main/scala-3/org/apache/pekko/persistence/TraitOrder.scala
@@ -23,6 +23,6 @@ private[persistence] object TraitOrder {
   val canBeChecked = false
 
   // No-op on Scala 3
-  def checkBefore(clazz: Class[_], one: Class[_], other: Class[_]): Unit =
+  def checkBefore(clazz: Class[?], one: Class[?], other: Class[?]): Unit =
     ()
 }
diff --git a/persistence/src/main/scala/org/apache/pekko/persistence/PersistencePlugin.scala b/persistence/src/main/scala/org/apache/pekko/persistence/PersistencePlugin.scala
index e1df4f708a..85e23d44e1 100644
--- a/persistence/src/main/scala/org/apache/pekko/persistence/PersistencePlugin.scala
+++ b/persistence/src/main/scala/org/apache/pekko/persistence/PersistencePlugin.scala
@@ -55,7 +55,7 @@ private[pekko] abstract class PersistencePlugin[ScalaDsl, JavaDsl, T: ClassTag](
     implicit ev: PluginProvider[T, ScalaDsl, JavaDsl]) {
 
   private val plugins = new AtomicReference[Map[String, ExtensionId[PluginHolder[ScalaDsl, JavaDsl]]]](Map.empty)
-  private val log = Logging(system, classOf[PersistencePlugin[_, _, _]])
+  private val log = Logging(system, classOf[PersistencePlugin[?, ?, ?]])
 
   @tailrec
   final protected def pluginFor(pluginId: String, readJournalPluginConfig: Config): PluginHolder[ScalaDsl, JavaDsl] = {
@@ -86,7 +86,7 @@ private[pekko] abstract class PersistencePlugin[ScalaDsl, JavaDsl, T: ClassTag](
     log.debug("Create plugin: {} {}", configPath, pluginClassName)
     val pluginClass = system.dynamicAccess.getClassFor[AnyRef](pluginClassName).get
 
-    def instantiate(args: collection.immutable.Seq[(Class[_], AnyRef)]) =
+    def instantiate(args: collection.immutable.Seq[(Class[?], AnyRef)]) =
       system.dynamicAccess.createInstanceFor[T](pluginClass, args)
 
     instantiate(
diff --git a/persistence/src/main/scala/org/apache/pekko/persistence/journal/EventAdapters.scala b/persistence/src/main/scala/org/apache/pekko/persistence/journal/EventAdapters.scala
index 5cc4b9cb59..ff89dd410c 100644
--- a/persistence/src/main/scala/org/apache/pekko/persistence/journal/EventAdapters.scala
+++ b/persistence/src/main/scala/org/apache/pekko/persistence/journal/EventAdapters.scala
@@ -31,8 +31,8 @@ import com.typesafe.config.Config
  * `EventAdapters` serves as a per-journal collection of bound event adapters.
  */
 class EventAdapters(
-    map: ConcurrentHashMap[Class[_], EventAdapter],
-    bindings: immutable.Seq[(Class[_], EventAdapter)],
+    map: ConcurrentHashMap[Class[?], EventAdapter],
+    bindings: immutable.Seq[(Class[?], EventAdapter)],
     log: LoggingAdapter) {
 
   /**
@@ -41,7 +41,7 @@ class EventAdapters(
    *
    * Falls back to [[IdentityEventAdapter]] if no adapter was defined for the given class.
    */
-  def get(clazz: Class[_]): EventAdapter = {
+  def get(clazz: Class[?]): EventAdapter = {
     map.get(clazz) match {
       case null => // bindings are ordered from most specific to least specific
         val value = bindings.filter {
@@ -71,7 +71,7 @@ private[pekko] object EventAdapters {
   type Name = String
   type BoundAdapters = immutable.Seq[String]
   type FQN = String
-  type ClassHandler = (Class[_], EventAdapter)
+  type ClassHandler = (Class[?], EventAdapter)
 
   def apply(system: ExtendedActorSystem, config: Config): EventAdapters = {
     val adapters = configToMap(config, "event-adapters")
@@ -115,7 +115,7 @@ private[pekko] object EventAdapters {
       sort(bs)
     }
 
-    val backing = bindings.foldLeft(new ConcurrentHashMap[Class[_], EventAdapter]) {
+    val backing = bindings.foldLeft(new ConcurrentHashMap[Class[?], EventAdapter]) {
       case (map, (c, s)) => map.put(c, s); map
     }
 
@@ -161,8 +161,8 @@ private[pekko] object EventAdapters {
    * Sort so that subtypes always precede their supertypes, but without
    * obeying any order between unrelated subtypes (insert sort).
    */
-  private def sort[T](in: Iterable[(Class[_], T)]): immutable.Seq[(Class[_], T)] =
-    in.foldLeft(new ArrayBuffer[(Class[_], T)](in.size)) { (buf, ca) =>
+  private def sort[T](in: Iterable[(Class[?], T)]): immutable.Seq[(Class[?], T)] =
+    in.foldLeft(new ArrayBuffer[(Class[?], T)](in.size)) { (buf, ca) =>
       buf.indexWhere(_._1.isAssignableFrom(ca._1)) match {
         case -1 => buf.append(ca)
         case x  => buf.insert(x, ca)
@@ -182,7 +182,7 @@ private[pekko] object EventAdapters {
     import scala.jdk.CollectionConverters._
     if (config.hasPath(path)) {
       config.getConfig(path).root.unwrapped.asScala.toMap.map {
-        case (k, v: util.ArrayList[_]) if v.isInstanceOf[util.ArrayList[_]] => k -> v.asScala.map(_.toString).toList
+        case (k, v: util.ArrayList[?]) if v.isInstanceOf[util.ArrayList[?]] => k -> v.asScala.map(_.toString).toList
         case (k, v)                                                         => k -> List(v.toString)
       }
     } else Map.empty
@@ -191,6 +191,6 @@ private[pekko] object EventAdapters {
 }
 
 private[pekko] case object IdentityEventAdapters extends EventAdapters(null, null, null) {
-  override def get(clazz: Class[_]): EventAdapter = IdentityEventAdapter
+  override def get(clazz: Class[?]): EventAdapter = IdentityEventAdapter
   override def toString = Logging.simpleName(IdentityEventAdapters)
 }
diff --git a/persistence/src/main/scala/org/apache/pekko/persistence/journal/PersistencePluginProxy.scala b/persistence/src/main/scala/org/apache/pekko/persistence/journal/PersistencePluginProxy.scala
index 01b2fe8b90..c06b4b376d 100644
--- a/persistence/src/main/scala/org/apache/pekko/persistence/journal/PersistencePluginProxy.scala
+++ b/persistence/src/main/scala/org/apache/pekko/persistence/journal/PersistencePluginProxy.scala
@@ -77,7 +77,7 @@ object PersistencePluginProxyExtension
     with ExtensionIdProvider {
   override def createExtension(system: ExtendedActorSystem): PersistencePluginProxyExtensionImpl =
     new PersistencePluginProxyExtensionImpl(system)
-  override def lookup: ExtensionId[_ <: Extension] = PersistencePluginProxyExtension
+  override def lookup: ExtensionId[? <: Extension] = PersistencePluginProxyExtension
   override def get(system: ActorSystem): PersistencePluginProxyExtensionImpl = super.get(system)
   override def get(system: ClassicActorSystemProvider): PersistencePluginProxyExtensionImpl = super.get(system)
 }
diff --git a/persistence/src/main/scala/org/apache/pekko/persistence/serialization/MessageSerializer.scala b/persistence/src/main/scala/org/apache/pekko/persistence/serialization/MessageSerializer.scala
index ffc4963774..c2060d7282 100644
--- a/persistence/src/main/scala/org/apache/pekko/persistence/serialization/MessageSerializer.scala
+++ b/persistence/src/main/scala/org/apache/pekko/persistence/serialization/MessageSerializer.scala
@@ -71,7 +71,7 @@ class MessageSerializer(val system: ExtendedActorSystem) extends BaseSerializer
    * Deserializes persistent messages. Delegates deserialization of a persistent
    * message's payload to a matching `org.apache.pekko.serialization.Serializer`.
    */
-  def fromBinary(bytes: Array[Byte], manifest: Option[Class[_]]): Message = manifest match {
+  def fromBinary(bytes: Array[Byte], manifest: Option[Class[?]]): Message = manifest match {
     case None    => persistent(mf.PersistentMessage.parseFrom(bytes))
     case Some(c) =>
       c match {
diff --git a/persistence/src/main/scala/org/apache/pekko/persistence/serialization/SnapshotSerializer.scala b/persistence/src/main/scala/org/apache/pekko/persistence/serialization/SnapshotSerializer.scala
index 3539ce85fb..d60b314a62 100644
--- a/persistence/src/main/scala/org/apache/pekko/persistence/serialization/SnapshotSerializer.scala
+++ b/persistence/src/main/scala/org/apache/pekko/persistence/serialization/SnapshotSerializer.scala
@@ -77,7 +77,7 @@ class SnapshotSerializer(val system: ExtendedActorSystem) extends BaseSerializer
    * Deserializes a [[Snapshot]]. Delegates deserialization of snapshot `data` to a matching
    * `org.apache.pekko.serialization.Serializer`.
    */
-  def fromBinary(bytes: Array[Byte], manifest: Option[Class[_]]): AnyRef =
+  def fromBinary(bytes: Array[Byte], manifest: Option[Class[?]]): AnyRef =
     Snapshot(snapshotFromBinary(bytes))
 
   private def headerToBinary(snapshot: AnyRef, snapshotSerializer: Serializer): Array[Byte] = {
diff --git a/persistence/src/main/scala/org/apache/pekko/persistence/state/DurableStateStoreRegistry.scala b/persistence/src/main/scala/org/apache/pekko/persistence/state/DurableStateStoreRegistry.scala
index c8d88f4d7c..64beff8d51 100644
--- a/persistence/src/main/scala/org/apache/pekko/persistence/state/DurableStateStoreRegistry.scala
+++ b/persistence/src/main/scala/org/apache/pekko/persistence/state/DurableStateStoreRegistry.scala
@@ -45,16 +45,16 @@ object DurableStateStoreRegistry extends ExtensionId[DurableStateStoreRegistry]
 
   @InternalApi
   private[pekko] val pluginProvider
-      : PluginProvider[DurableStateStoreProvider, DurableStateStore[_], javadsl.DurableStateStore[_]] =
-    new PluginProvider[DurableStateStoreProvider, scaladsl.DurableStateStore[_], javadsl.DurableStateStore[_]] {
-      override def scalaDsl(t: DurableStateStoreProvider): DurableStateStore[_] = t.scaladslDurableStateStore()
-      override def javaDsl(t: DurableStateStoreProvider): javadsl.DurableStateStore[_] = t.javadslDurableStateStore()
+      : PluginProvider[DurableStateStoreProvider, DurableStateStore[?], javadsl.DurableStateStore[?]] =
+    new PluginProvider[DurableStateStoreProvider, scaladsl.DurableStateStore[?], javadsl.DurableStateStore[?]] {
+      override def scalaDsl(t: DurableStateStoreProvider): DurableStateStore[?] = t.scaladslDurableStateStore()
+      override def javaDsl(t: DurableStateStoreProvider): javadsl.DurableStateStore[?] = t.javadslDurableStateStore()
     }
 
 }
 
 class DurableStateStoreRegistry(system: ExtendedActorSystem)
-    extends PersistencePlugin[scaladsl.DurableStateStore[_], javadsl.DurableStateStore[_], DurableStateStoreProvider](
+    extends PersistencePlugin[scaladsl.DurableStateStore[?], javadsl.DurableStateStore[?], DurableStateStoreProvider](
       system)(ClassTag(classOf[DurableStateStoreProvider]), DurableStateStoreRegistry.pluginProvider)
     with Extension {
 
@@ -87,7 +87,7 @@ class DurableStateStoreRegistry(system: ExtendedActorSystem)
    * Scala API: Returns the [[pekko.persistence.state.scaladsl.DurableStateStore]] specified by the given
    * configuration entry.
    */
-  final def durableStateStoreFor[T <: scaladsl.DurableStateStore[_]](pluginId: String): T = {
+  final def durableStateStoreFor[T <: scaladsl.DurableStateStore[?]](pluginId: String): T = {
     pluginFor(pluginIdOrDefault(pluginId), pluginConfig(pluginId)).scaladslPlugin.asInstanceOf[T]
   }
 
@@ -95,7 +95,7 @@ class DurableStateStoreRegistry(system: ExtendedActorSystem)
    * Java API: Returns the [[pekko.persistence.state.javadsl.DurableStateStore]] specified by the given
    * configuration entry.
    */
-  final def getDurableStateStoreFor[T <: javadsl.DurableStateStore[_]](
+  final def getDurableStateStoreFor[T <: javadsl.DurableStateStore[?]](
       @nowarn("msg=never used") clazz: Class[T], // FIXME generic Class could be problematic in Java
       pluginId: String): T = {
     pluginFor(pluginIdOrDefault(pluginId), pluginConfig(pluginId)).javadslPlugin.asInstanceOf[T]
diff --git a/persistence/src/test/scala/org/apache/pekko/persistence/AtLeastOnceDeliverySpec.scala b/persistence/src/test/scala/org/apache/pekko/persistence/AtLeastOnceDeliverySpec.scala
index 9753c9e08e..84759118f2 100644
--- a/persistence/src/test/scala/org/apache/pekko/persistence/AtLeastOnceDeliverySpec.scala
+++ b/persistence/src/test/scala/org/apache/pekko/persistence/AtLeastOnceDeliverySpec.scala
@@ -257,7 +257,7 @@ class AtLeastOnceDeliverySpec
 
     "not allow using actorSelection with wildcards" in {
       system.actorOf(Props(classOf[DeliverToStarSelection], name)) ! "anything, really."
-      expectMsgType[Failure[_]].toString should include("not supported")
+      expectMsgType[Failure[?]].toString should include("not supported")
     }
 
     "re-deliver lost messages after restart" taggedAs TimingTest in {
diff --git a/persistence/src/test/scala/org/apache/pekko/persistence/PersistentActorSpec.scala b/persistence/src/test/scala/org/apache/pekko/persistence/PersistentActorSpec.scala
index 75d666bbd7..31f5a2238d 100644
--- a/persistence/src/test/scala/org/apache/pekko/persistence/PersistentActorSpec.scala
+++ b/persistence/src/test/scala/org/apache/pekko/persistence/PersistentActorSpec.scala
@@ -217,7 +217,7 @@ object PersistentActorSpec {
 
   class SnapshottingPersistentActor(name: String, probe: ActorRef) extends ExamplePersistentActor(name) {
     override def receiveRecover = super.receiveRecover.orElse {
-      case SnapshotOffer(_, events: List[_]) =>
+      case SnapshotOffer(_, events: List[?]) =>
         probe ! "offered"
         this.events = events
     }
diff --git a/persistence/src/test/scala/org/apache/pekko/persistence/SnapshotRecoveryWithEmptyJournalSpec.scala b/persistence/src/test/scala/org/apache/pekko/persistence/SnapshotRecoveryWithEmptyJournalSpec.scala
index e45ffb2f04..ec05eaf48d 100644
--- a/persistence/src/test/scala/org/apache/pekko/persistence/SnapshotRecoveryWithEmptyJournalSpec.scala
+++ b/persistence/src/test/scala/org/apache/pekko/persistence/SnapshotRecoveryWithEmptyJournalSpec.scala
@@ -33,7 +33,7 @@ object SnapshotRecoveryWithEmptyJournalSpec {
 
     override def receiveRecover: Receive = {
       case payload: String                     => state = s"$payload-$lastSequenceNr" :: state
-      case SnapshotOffer(_, snapshot: List[_]) => state = snapshot.asInstanceOf[List[String]]
+      case SnapshotOffer(_, snapshot: List[?]) => state = snapshot.asInstanceOf[List[String]]
     }
 
     override def receiveCommand: PartialFunction[Any, Unit] = {
diff --git a/persistence/src/test/scala/org/apache/pekko/persistence/SnapshotSerializationSpec.scala b/persistence/src/test/scala/org/apache/pekko/persistence/SnapshotSerializationSpec.scala
index 0a401cbb92..4ce46493e4 100644
--- a/persistence/src/test/scala/org/apache/pekko/persistence/SnapshotSerializationSpec.scala
+++ b/persistence/src/test/scala/org/apache/pekko/persistence/SnapshotSerializationSpec.scala
@@ -51,7 +51,7 @@ object SnapshotSerializationSpec {
       bStream.toByteArray
     }
 
-    def fromBinary(bytes: Array[Byte], clazz: Option[Class[_]]): AnyRef = {
+    def fromBinary(bytes: Array[Byte], clazz: Option[Class[?]]): AnyRef = {
       val bStream = new ByteArrayInputStream(bytes)
       val reader = new BufferedReader(new InputStreamReader(bStream))
       new MySnapshot(reader.readLine())
diff --git a/persistence/src/test/scala/org/apache/pekko/persistence/SnapshotSpec.scala b/persistence/src/test/scala/org/apache/pekko/persistence/SnapshotSpec.scala
index c065eb141d..b1c40a3b75 100644
--- a/persistence/src/test/scala/org/apache/pekko/persistence/SnapshotSpec.scala
+++ b/persistence/src/test/scala/org/apache/pekko/persistence/SnapshotSpec.scala
@@ -25,7 +25,7 @@ object SnapshotSpec {
 
     override def receiveRecover: Receive = {
       case payload: String                     => state = s"$payload-$lastSequenceNr" :: state
-      case SnapshotOffer(_, snapshot: List[_]) => state = snapshot.asInstanceOf[List[String]]
+      case SnapshotOffer(_, snapshot: List[?]) => state = snapshot.asInstanceOf[List[String]]
     }
 
     override def receiveCommand = {
diff --git a/persistence/src/test/scala/org/apache/pekko/persistence/serialization/SnapshotSerializerMigrationAkkaSpec.scala b/persistence/src/test/scala/org/apache/pekko/persistence/serialization/SnapshotSerializerMigrationAkkaSpec.scala
index edc1e263a1..6a8b761435 100644
--- a/persistence/src/test/scala/org/apache/pekko/persistence/serialization/SnapshotSerializerMigrationAkkaSpec.scala
+++ b/persistence/src/test/scala/org/apache/pekko/persistence/serialization/SnapshotSerializerMigrationAkkaSpec.scala
@@ -40,8 +40,8 @@ class SnapshotSerializerMigrationAkkaSpec extends PekkoSpec(
       val bytes = Base64.getDecoder.decode(akkaSnapshotData)
       val result = serialization.deserialize(bytes, classOf[Snapshot]).get
       val deserialized = result.data
-      deserialized shouldBe a[PersistentFSMSnapshot[_]]
-      val persistentFSMSnapshot = deserialized.asInstanceOf[PersistentFSMSnapshot[_]]
+      deserialized shouldBe a[PersistentFSMSnapshot[?]]
+      val persistentFSMSnapshot = deserialized.asInstanceOf[PersistentFSMSnapshot[?]]
       persistentFSMSnapshot shouldEqual fsmSnapshot
     }
     "deserialize pekko snapshots" in {
@@ -49,8 +49,8 @@ class SnapshotSerializerMigrationAkkaSpec extends PekkoSpec(
       val bytes = serialization.serialize(Snapshot(fsmSnapshot)).get
       val result = serialization.deserialize(bytes, classOf[Snapshot]).get
       val deserialized = result.data
-      deserialized shouldBe a[PersistentFSMSnapshot[_]]
-      val persistentFSMSnapshot = deserialized.asInstanceOf[PersistentFSMSnapshot[_]]
+      deserialized shouldBe a[PersistentFSMSnapshot[?]]
+      val persistentFSMSnapshot = deserialized.asInstanceOf[PersistentFSMSnapshot[?]]
       persistentFSMSnapshot shouldEqual fsmSnapshot
     }
     "serialize snapshot with Akka class name" in {
diff --git a/persistence/src/test/scala/org/apache/pekko/persistence/serialization/SnapshotSerializerNoMigrationSpec.scala b/persistence/src/test/scala/org/apache/pekko/persistence/serialization/SnapshotSerializerNoMigrationSpec.scala
index 695e23e221..6ac992daab 100644
--- a/persistence/src/test/scala/org/apache/pekko/persistence/serialization/SnapshotSerializerNoMigrationSpec.scala
+++ b/persistence/src/test/scala/org/apache/pekko/persistence/serialization/SnapshotSerializerNoMigrationSpec.scala
@@ -37,8 +37,8 @@ class SnapshotSerializerNoMigrationSpec extends PekkoSpec(
       val bytes = serialization.serialize(Snapshot(fsmSnapshot)).get
       val result = serialization.deserialize(bytes, classOf[Snapshot]).get
       val deserialized = result.data
-      deserialized shouldBe a[PersistentFSMSnapshot[_]]
-      val persistentFSMSnapshot = deserialized.asInstanceOf[PersistentFSMSnapshot[_]]
+      deserialized shouldBe a[PersistentFSMSnapshot[?]]
+      val persistentFSMSnapshot = deserialized.asInstanceOf[PersistentFSMSnapshot[?]]
       persistentFSMSnapshot shouldEqual fsmSnapshot
     }
     "fail to deserialize akka snapshots" in {
diff --git a/persistence/src/test/scala/org/apache/pekko/persistence/serialization/SnapshotSerializerSpec.scala b/persistence/src/test/scala/org/apache/pekko/persistence/serialization/SnapshotSerializerSpec.scala
index e8aaada854..8d7726986e 100644
--- a/persistence/src/test/scala/org/apache/pekko/persistence/serialization/SnapshotSerializerSpec.scala
+++ b/persistence/src/test/scala/org/apache/pekko/persistence/serialization/SnapshotSerializerSpec.scala
@@ -46,8 +46,8 @@ class SnapshotSerializerSpec extends PekkoSpec {
       val bytes = Base64.getDecoder.decode(akkaSnapshotData)
       val result = serialization.deserialize(bytes, classOf[Snapshot]).get
       val deserialized = result.data
-      deserialized shouldBe a[PersistentFSMSnapshot[_]]
-      val persistentFSMSnapshot = deserialized.asInstanceOf[PersistentFSMSnapshot[_]]
+      deserialized shouldBe a[PersistentFSMSnapshot[?]]
+      val persistentFSMSnapshot = deserialized.asInstanceOf[PersistentFSMSnapshot[?]]
       persistentFSMSnapshot shouldEqual fsmSnapshot
     }
     "deserialize pekko snapshots" in {
@@ -55,8 +55,8 @@ class SnapshotSerializerSpec extends PekkoSpec {
       val bytes = serialization.serialize(Snapshot(fsmSnapshot)).get
       val result = serialization.deserialize(bytes, classOf[Snapshot]).get
       val deserialized = result.data
-      deserialized shouldBe a[PersistentFSMSnapshot[_]]
-      val persistentFSMSnapshot = deserialized.asInstanceOf[PersistentFSMSnapshot[_]]
+      deserialized shouldBe a[PersistentFSMSnapshot[?]]
+      val persistentFSMSnapshot = deserialized.asInstanceOf[PersistentFSMSnapshot[?]]
       persistentFSMSnapshot shouldEqual fsmSnapshot
     }
     "deserialize pre-saved pekko snapshots" in {
@@ -67,8 +67,8 @@ class SnapshotSerializerSpec extends PekkoSpec {
       val bytes = Base64.getDecoder.decode(pekkoSnapshotData)
       val result = serialization.deserialize(bytes, classOf[Snapshot]).get
       val deserialized = result.data
-      deserialized shouldBe a[PersistentFSMSnapshot[_]]
-      val persistentFSMSnapshot = deserialized.asInstanceOf[PersistentFSMSnapshot[_]]
+      deserialized shouldBe a[PersistentFSMSnapshot[?]]
+      val persistentFSMSnapshot = deserialized.asInstanceOf[PersistentFSMSnapshot[?]]
       persistentFSMSnapshot shouldEqual fsmSnapshot
     }
     "produce binary format with header length in first 4 bytes (little-endian)" in {
diff --git a/persistence/src/test/scala/org/apache/pekko/persistence/state/exception/DurableStateExceptionsSpec.scala b/persistence/src/test/scala/org/apache/pekko/persistence/state/exception/DurableStateExceptionsSpec.scala
index bac0b475a9..1a37d0c474 100644
--- a/persistence/src/test/scala/org/apache/pekko/persistence/state/exception/DurableStateExceptionsSpec.scala
+++ b/persistence/src/test/scala/org/apache/pekko/persistence/state/exception/DurableStateExceptionsSpec.scala
@@ -39,7 +39,7 @@ class DurableStateExceptionsSpec extends AnyWordSpecLike
 
   "DurableStateException support" must {
     "allow creating DeleteRevisionException using MethodHandle" in {
-      val exceptionClassOpt: Option[Class[_]] = Try(Class.forName(
+      val exceptionClassOpt: Option[Class[?]] = Try(Class.forName(
         "org.apache.pekko.persistence.state.exception.DeleteRevisionException")).toOption
       exceptionClassOpt should not be empty
       val constructorOpt = exceptionClassOpt.map { clz =>
diff --git a/project/AddLogTimestamps.scala b/project/AddLogTimestamps.scala
index 4a0269e380..ace4ea9d20 100644
--- a/project/AddLogTimestamps.scala
+++ b/project/AddLogTimestamps.scala
@@ -28,7 +28,7 @@ object AddLogTimestamps extends AutoPlugin {
 
   private val UTC = ZoneId.of("UTC")
 
-  override lazy val projectSettings: Seq[Def.Setting[_]] = {
+  override lazy val projectSettings: Seq[Def.Setting[?]] = {
     logManager := {
       val original = logManager.value
 
diff --git a/project/CopyrightHeaderForBoilerplate.scala b/project/CopyrightHeaderForBoilerplate.scala
index e162a945fd..3e91671e70 100644
--- a/project/CopyrightHeaderForBoilerplate.scala
+++ b/project/CopyrightHeaderForBoilerplate.scala
@@ -21,7 +21,7 @@ object CopyrightHeaderForBoilerplate extends AutoPlugin {
   override lazy val requires: Plugins = BoilerplatePlugin && CopyrightHeader
   override lazy val trigger: PluginTrigger = allRequirements
 
-  override lazy val projectSettings: Seq[Def.Setting[_]] = {
+  override lazy val projectSettings: Seq[Def.Setting[?]] = {
     Seq(Compile, Test).flatMap { config =>
       inConfig(config) {
         Seq(
diff --git a/project/CopyrightHeaderForBuild.scala b/project/CopyrightHeaderForBuild.scala
index ce92ad5bb6..2ab945e142 100644
--- a/project/CopyrightHeaderForBuild.scala
+++ b/project/CopyrightHeaderForBuild.scala
@@ -20,7 +20,7 @@ object CopyrightHeaderForBuild extends AutoPlugin {
   override lazy val requires: Plugins = CopyrightHeader
   override lazy val trigger: PluginTrigger = noTrigger
 
-  override lazy val projectSettings: Seq[Def.Setting[_]] = {
+  override lazy val projectSettings: Seq[Def.Setting[?]] = {
     Seq(Compile, Test).flatMap { config =>
       inConfig(config) {
         Seq(
diff --git a/project/CopyrightHeaderForJdk9.scala b/project/CopyrightHeaderForJdk9.scala
index 726ad48951..c399f09da1 100644
--- a/project/CopyrightHeaderForJdk9.scala
+++ b/project/CopyrightHeaderForJdk9.scala
@@ -28,7 +28,7 @@ object CopyrightHeaderForJdk9 extends AutoPlugin {
     } yield file
   }
 
-  override lazy val projectSettings: Seq[Def.Setting[_]] = {
+  override lazy val projectSettings: Seq[Def.Setting[?]] = {
 
     Seq(Compile / headerSources ++= additionalFiles.value,
       Test / headerSources ++= additionalFiles.value)
diff --git a/project/CopyrightHeaderForProtobuf.scala b/project/CopyrightHeaderForProtobuf.scala
index 8e30263751..f18723a60b 100644
--- a/project/CopyrightHeaderForProtobuf.scala
+++ b/project/CopyrightHeaderForProtobuf.scala
@@ -21,7 +21,7 @@ object CopyrightHeaderForProtobuf extends AutoPlugin {
   override lazy val requires = CopyrightHeader
   override lazy val trigger = allRequirements
 
-  override lazy val projectSettings: Seq[Def.Setting[_]] = {
+  override lazy val projectSettings: Seq[Def.Setting[?]] = {
     Seq(Compile, Test).flatMap { config =>
       inConfig(config) {
         Seq(
diff --git a/project/JavaFormatter.scala b/project/JavaFormatter.scala
index f842266dee..f48d36e220 100644
--- a/project/JavaFormatter.scala
+++ b/project/JavaFormatter.scala
@@ -28,7 +28,7 @@ object JavaFormatter extends AutoPlugin {
   import sbt._
   import sbt.io._
 
-  override lazy val projectSettings: Seq[Def.Setting[_]] =
+  override lazy val projectSettings: Seq[Def.Setting[?]] =
     Seq(
       // below is for sbt java formatter
       javafmt / excludeFilter := {
diff --git a/project/MultiNode.scala b/project/MultiNode.scala
index 0021487286..61d73d87bd 100644
--- a/project/MultiNode.scala
+++ b/project/MultiNode.scala
@@ -49,7 +49,7 @@ object MultiNode extends AutoPlugin {
   override lazy val trigger = noTrigger
   override lazy val requires = plugins.JvmPlugin && MultiJvmPlugin
 
-  override lazy val projectSettings: Seq[Def.Setting[_]] = multiJvmSettings
+  override lazy val projectSettings: Seq[Def.Setting[?]] = multiJvmSettings
 
   private lazy val defaultMultiJvmOptions: Seq[String] = {
     import scala.jdk.CollectionConverters._
diff --git a/project/PekkoBuild.scala b/project/PekkoBuild.scala
index bff7ab34bf..2eab25cf4c 100644
--- a/project/PekkoBuild.scala
+++ b/project/PekkoBuild.scala
@@ -114,7 +114,7 @@ object PekkoBuild {
 
   final val DefaultJavacOptions = Seq("-encoding", "UTF-8", "-Xlint:unchecked")
 
-  lazy val defaultSettings: Seq[Setting[_]] = Def.settings(
+  lazy val defaultSettings: Seq[Setting[?]] = Def.settings(
     projectInfoVersion := (if (isSnapshot.value) "snapshot" else version.value),
     Dependencies.Versions,
     resolverSettings,
@@ -254,7 +254,7 @@ object PekkoBuild {
       }
     })
 
-  lazy val welcomeSettings: Seq[Setting[_]] = Def.settings {
+  lazy val welcomeSettings: Seq[Setting[?]] = Def.settings {
     import sbtwelcome._
     Seq(
       logo := {
diff --git a/project/PekkoDevelocityPlugin.scala b/project/PekkoDevelocityPlugin.scala
index 01a0602847..9c94d99622 100644
--- a/project/PekkoDevelocityPlugin.scala
+++ b/project/PekkoDevelocityPlugin.scala
@@ -34,7 +34,7 @@ object PekkoDevelocityPlugin extends AutoPlugin {
   override lazy val trigger: PluginTrigger = allRequirements
   override lazy val requires: Plugins = DevelocityPlugin
 
-  override lazy val buildSettings: Seq[Setting[_]] = Def.settings(
+  override lazy val buildSettings: Seq[Setting[?]] = Def.settings(
     develocityConfiguration := {
       val isInsideCI = insideCI.value
 
diff --git a/project/Protobuf.scala b/project/Protobuf.scala
index 0028f24903..d74994468a 100644
--- a/project/Protobuf.scala
+++ b/project/Protobuf.scala
@@ -33,7 +33,7 @@ object Protobuf {
   lazy val protocVersion = SettingKey[String]("protobuf-protoc-version", "The version of the protoc executable.")
   lazy val protobufGenerate = TaskKey[Unit]("protobufGenerate", "Compile the protobuf sources and do all processing.")
 
-  lazy val settings: Seq[Setting[_]] = Seq(
+  lazy val settings: Seq[Setting[?]] = Seq(
     paths := Seq((Compile / sourceDirectory).value, (Test / sourceDirectory).value).map(_ / "protobuf"),
     outputPaths := Seq((Compile / sourceDirectory).value, (Test / sourceDirectory).value).map(_ / "java"),
     importPath := None,
diff --git a/project/SbtMultiJvmPlugin.scala b/project/SbtMultiJvmPlugin.scala
index c07b27ac99..01c484f986 100644
--- a/project/SbtMultiJvmPlugin.scala
+++ b/project/SbtMultiJvmPlugin.scala
@@ -84,10 +84,10 @@ object MultiJvmPlugin extends AutoPlugin {
 
   override lazy val projectSettings = multiJvmSettings
 
-  private[this] def noTestsMessage(scoped: ScopedKey[_])(implicit display: Show[ScopedKey[_]]): String =
+  private[this] def noTestsMessage(scoped: ScopedKey[?])(implicit display: Show[ScopedKey[?]]): String =
     "No tests to run for " + display.show(scoped)
 
-  lazy val multiJvmSettings: Seq[Def.Setting[_]] =
+  lazy val multiJvmSettings: Seq[Def.Setting[?]] =
     inConfig(MultiJvm)(Defaults.configSettings ++ internalMultiJvmSettings)
 
   // https://github.com/sbt/sbt/blob/v0.13.15/main/actions/src/main/scala/sbt/Tests.scala#L296-L298
diff --git a/project/ScalaFixExtraRulesPlugin.scala b/project/ScalaFixExtraRulesPlugin.scala
index a87a2aa812..a2bb844d59 100644
--- a/project/ScalaFixExtraRulesPlugin.scala
+++ b/project/ScalaFixExtraRulesPlugin.scala
@@ -21,7 +21,7 @@ object ScalaFixExtraRulesPlugin extends AutoPlugin with ScalafixSupport {
 
   import sbt._
   import scalafix.sbt.ScalafixPlugin.autoImport.scalafixDependencies
-  override lazy val projectSettings: Seq[Def.Setting[_]] = super.projectSettings ++ {
+  override lazy val projectSettings: Seq[Def.Setting[?]] = super.projectSettings ++ {
     ThisBuild / scalafixDependencies ++= Seq(
       "com.nequissimus" %% "sort-imports" % "0.6.1")
   }
diff --git a/project/ScalaFixForJdk9Plugin.scala b/project/ScalaFixForJdk9Plugin.scala
index b0dfa05e1b..90b0bd96e6 100644
--- a/project/ScalaFixForJdk9Plugin.scala
+++ b/project/ScalaFixForJdk9Plugin.scala
@@ -22,9 +22,9 @@ object ScalaFixForJdk9Plugin extends AutoPlugin with ScalafixSupport {
   import ScalafixPlugin.autoImport.scalafixConfigSettings
   import sbt._
 
-  lazy val scalafixIgnoredSetting: Seq[Setting[_]] = Seq(ignore(TestJdk9))
+  lazy val scalafixIgnoredSetting: Seq[Setting[?]] = Seq(ignore(TestJdk9))
 
-  override lazy val projectSettings: Seq[Def.Setting[_]] =
+  override lazy val projectSettings: Seq[Def.Setting[?]] =
     Seq(CompileJdk9, TestJdk9).flatMap(c => inConfig(c)(scalafixConfigSettings(c))) ++
     scalafixIgnoredSetting ++ Seq(
       updateProjectCommands(
diff --git a/project/ScalafixForMultiNodePlugin.scala b/project/ScalafixForMultiNodePlugin.scala
index 97fc92753d..1ba402d636 100644
--- a/project/ScalafixForMultiNodePlugin.scala
+++ b/project/ScalafixForMultiNodePlugin.scala
@@ -22,9 +22,9 @@ object ScalafixForMultiNodePlugin extends AutoPlugin with ScalafixSupport {
 
   import MultiJvmPlugin.autoImport._
 
-  lazy val scalafixIgnoredSetting: Seq[Setting[_]] = Seq(ignore(MultiJvm))
+  lazy val scalafixIgnoredSetting: Seq[Setting[?]] = Seq(ignore(MultiJvm))
 
-  override lazy val projectSettings: Seq[Def.Setting[_]] =
+  override lazy val projectSettings: Seq[Def.Setting[?]] =
     Seq(MultiJvm).flatMap(c => inConfig(c)(scalafixConfigSettings(c))) ++
     scalafixIgnoredSetting ++ Seq(
       updateProjectCommands(alias = "fixall", value = ";scalafixEnable;scalafixAll;scalafmtAll"),
diff --git a/project/ScalafixIgnoreFilePlugin.scala b/project/ScalafixIgnoreFilePlugin.scala
index 2e404cdad0..bd11b27b5f 100644
--- a/project/ScalafixIgnoreFilePlugin.scala
+++ b/project/ScalafixIgnoreFilePlugin.scala
@@ -20,9 +20,9 @@ object ScalafixIgnoreFilePlugin extends AutoPlugin with ScalafixSupport {
 
   override lazy val requires: Plugins = JvmPlugin && ScalafixPlugin
   import sbt._
-  lazy val scalafixIgnoredSetting: Seq[Setting[_]] = if (ScalafixSupport.fixTestScope) Nil else Seq(ignore(Test))
+  lazy val scalafixIgnoredSetting: Seq[Setting[?]] = if (ScalafixSupport.fixTestScope) Nil else Seq(ignore(Test))
 
-  override lazy val projectSettings: Seq[Def.Setting[_]] =
+  override lazy val projectSettings: Seq[Def.Setting[?]] =
     scalafixIgnoredSetting ++ Seq(
       addProjectCommandsIfAbsent(alias = "fixall", value = ";scalafixEnable;scalafixAll;test:compile;reload"))
 }
diff --git a/project/StreamOperatorsIndexGenerator.scala b/project/StreamOperatorsIndexGenerator.scala
index 4da0cf2b3c..1dcce00698 100644
--- a/project/StreamOperatorsIndexGenerator.scala
+++ b/project/StreamOperatorsIndexGenerator.scala
@@ -21,7 +21,7 @@ import scala.util.control.NonFatal
  */
 object StreamOperatorsIndexGenerator extends AutoPlugin {
 
-  override val projectSettings: Seq[Setting[_]] = inConfig(Compile)(
+  override val projectSettings: Seq[Setting[?]] = inConfig(Compile)(
     Seq(
       resourceGenerators +=
         generateAlphabeticalIndex(sourceDirectory, _ / "paradox" / "stream" / "operators" / "index.md")))
diff --git a/project/ValidatePullRequest.scala b/project/ValidatePullRequest.scala
index 3932172949..246e98b6f3 100644
--- a/project/ValidatePullRequest.scala
+++ b/project/ValidatePullRequest.scala
@@ -36,7 +36,7 @@ object PekkoValidatePullRequest extends AutoPlugin {
 
   override lazy val projectConfigurations = Seq(ValidatePR)
 
-  lazy val additionalTasks = settingKey[Seq[TaskKey[_]]]("Additional tasks for pull request validation")
+  lazy val additionalTasks = settingKey[Seq[TaskKey[?]]]("Additional tasks for pull request validation")
 
   override lazy val globalSettings = Seq(credentials ++= {
       // todo this should probably be supplied properly
diff --git a/project/VersionGenerator.scala b/project/VersionGenerator.scala
index 7b5d2073d3..af60d14669 100644
--- a/project/VersionGenerator.scala
+++ b/project/VersionGenerator.scala
@@ -19,7 +19,7 @@ import sbt.Keys._
  */
 object VersionGenerator {
 
-  lazy val settings: Seq[Setting[_]] = inConfig(Compile)(
+  lazy val settings: Seq[Setting[?]] = inConfig(Compile)(
     Seq(
       resourceGenerators += generateVersion(
         resourceManaged, _ / "version.conf",
diff --git a/remote/src/main/scala/org/apache/pekko/remote/Endpoint.scala b/remote/src/main/scala/org/apache/pekko/remote/Endpoint.scala
index c6b379685d..88e68e5270 100644
--- a/remote/src/main/scala/org/apache/pekko/remote/Endpoint.scala
+++ b/remote/src/main/scala/org/apache/pekko/remote/Endpoint.scala
@@ -81,7 +81,7 @@ private[remote] class DefaultMessageDispatcher(
     import provider.remoteSettings._
 
     lazy val payload: AnyRef = MessageSerializer.deserialize(system, serializedMessage)
-    def payloadClass: Class[_] = if (payload eq null) null else payload.getClass
+    def payloadClass: Class[?] = if (payload eq null) null else payload.getClass
     val sender: ActorRef = senderOption.getOrElse(system.deadLetters)
     val originalReceiver = recipient.path
 
diff --git a/remote/src/main/scala/org/apache/pekko/remote/RemoteDaemon.scala b/remote/src/main/scala/org/apache/pekko/remote/RemoteDaemon.scala
index 01509ec4b3..34ac5b41e5 100644
--- a/remote/src/main/scala/org/apache/pekko/remote/RemoteDaemon.scala
+++ b/remote/src/main/scala/org/apache/pekko/remote/RemoteDaemon.scala
@@ -285,7 +285,7 @@ private[pekko] class RemoteSystemDaemon(
 }
 
 /** INTERNAL API */
-final class NotAllowedClassRemoteDeploymentAttemptException(illegal: Class[_], allowedClassNames: immutable.Set[String])
+final class NotAllowedClassRemoteDeploymentAttemptException(illegal: Class[?], allowedClassNames: immutable.Set[String])
     extends RuntimeException(
       s"Attempted to deploy Actor class: " +
       s"[$illegal], " +
diff --git a/remote/src/main/scala/org/apache/pekko/remote/RemoteMetricsExtension.scala b/remote/src/main/scala/org/apache/pekko/remote/RemoteMetricsExtension.scala
index 529a8d3b40..92910370de 100644
--- a/remote/src/main/scala/org/apache/pekko/remote/RemoteMetricsExtension.scala
+++ b/remote/src/main/scala/org/apache/pekko/remote/RemoteMetricsExtension.scala
@@ -77,7 +77,7 @@ private[pekko] class RemoteMetricsOn(system: ExtendedActorSystem) extends Remote
   private val logFrameSizeExceeding: Int =
     RARP(system).provider.remoteSettings.LogFrameSizeExceeding.getOrElse(Int.MaxValue)
   private val log = Logging(system, classOf[RemoteMetrics])
-  private val maxPayloadBytes: ConcurrentHashMap[Class[_], Integer] = new ConcurrentHashMap
+  private val maxPayloadBytes: ConcurrentHashMap[Class[?], Integer] = new ConcurrentHashMap
 
   override def logPayloadBytes(msg: Any, payloadBytes: Int): Unit =
     if (payloadBytes >= logFrameSizeExceeding) {
diff --git a/remote/src/main/scala/org/apache/pekko/remote/artery/Handshake.scala b/remote/src/main/scala/org/apache/pekko/remote/artery/Handshake.scala
index c169056805..0c4c3c3deb 100644
--- a/remote/src/main/scala/org/apache/pekko/remote/artery/Handshake.scala
+++ b/remote/src/main/scala/org/apache/pekko/remote/artery/Handshake.scala
@@ -93,7 +93,7 @@ private[remote] class OutboundHandshake(
... 6292 lines suppressed ...


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pekko.apache.org
For additional commands, e-mail: commits-help@pekko.apache.org