diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2020 Torsten Schmits
+Copyright (c) 2023 Torsten Schmits
 
 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
 following conditions are met:
diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,4 +1,4 @@
-# Unreleased
+# 0.10.0.0
 
 * Add `oneshot` variants of `Process` interpreters that send `Stop` to the individual actions inside the scope, modeling
   a process that is expected to terminate.
diff --git a/polysemy-process.cabal b/polysemy-process.cabal
--- a/polysemy-process.cabal
+++ b/polysemy-process.cabal
@@ -1,29 +1,29 @@
 cabal-version: 2.2
 
--- This file has been generated from package.yaml by hpack version 0.35.0.
+-- This file has been generated from package.yaml by hpack version 0.35.2.
 --
 -- see: https://github.com/sol/hpack
 
 name:           polysemy-process
-version:        0.12.1.0
+version:        0.13.0.0
 synopsis:       Polysemy effects for system processes
 description:    See https://hackage.haskell.org/package/polysemy-process/docs/Polysemy-Process.html
-category:       Concurrency
-homepage:       https://git.tryp.io/tek/polysemy-conc
+category:       Process
+homepage:       https://github.com/tek/polysemy-conc#readme
 bug-reports:    https://github.com/tek/polysemy-conc/issues
 author:         Torsten Schmits
 maintainer:     hackage@tryp.io
-copyright:      2022 Torsten Schmits
+copyright:      2023 Torsten Schmits
 license:        BSD-2-Clause-Patent
 license-file:   LICENSE
 build-type:     Simple
 extra-source-files:
-    changelog.md
     readme.md
+    changelog.md
 
 source-repository head
   type: git
-  location: https://git.tryp.io/tek/polysemy-conc
+  location: https://github.com/tek/polysemy-conc
 
 library
   exposed-modules:
@@ -58,76 +58,49 @@
   default-extensions:
       AllowAmbiguousTypes
       ApplicativeDo
-      BangPatterns
-      BinaryLiterals
       BlockArguments
-      ConstraintKinds
       DataKinds
       DefaultSignatures
       DeriveAnyClass
-      DeriveDataTypeable
-      DeriveFoldable
-      DeriveFunctor
-      DeriveGeneric
-      DeriveLift
-      DeriveTraversable
       DerivingStrategies
       DerivingVia
       DisambiguateRecordFields
-      DoAndIfThenElse
       DuplicateRecordFields
-      EmptyCase
-      EmptyDataDecls
-      ExistentialQuantification
-      FlexibleContexts
-      FlexibleInstances
       FunctionalDependencies
       GADTs
-      GeneralizedNewtypeDeriving
-      InstanceSigs
-      KindSignatures
       LambdaCase
       LiberalTypeSynonyms
-      MultiParamTypeClasses
       MultiWayIf
-      NamedFieldPuns
       OverloadedLabels
       OverloadedLists
       OverloadedStrings
       PackageImports
       PartialTypeSignatures
-      PatternGuards
       PatternSynonyms
-      PolyKinds
       QuantifiedConstraints
       QuasiQuotes
-      RankNTypes
       RecordWildCards
       RecursiveDo
       RoleAnnotations
-      ScopedTypeVariables
-      StandaloneDeriving
       TemplateHaskell
-      TupleSections
-      TypeApplications
       TypeFamilies
       TypeFamilyDependencies
-      TypeOperators
-      TypeSynonymInstances
       UndecidableInstances
       UnicodeSyntax
       ViewPatterns
-  ghc-options: -Wall -Wredundant-constraints -Wincomplete-uni-patterns -Wmissing-deriving-strategies -Widentities -Wunused-packages
+      OverloadedRecordDot
+      NoFieldSelectors
+  ghc-options: -Wall -Widentities -Wincomplete-uni-patterns -Wmissing-deriving-strategies -Wredundant-constraints -Wunused-type-patterns -Wunused-packages
   build-depends:
-      base >=4.12 && <5
-    , incipit-core >=0.4.1
+      base ==4.*
+    , incipit-core ==0.5.*
     , path ==0.9.*
-    , path-io ==1.7.*
+    , path-io >=1.7 && <1.9
     , polysemy ==1.9.*
-    , polysemy-conc ==0.12.*
-    , polysemy-resume ==0.7.*
+    , polysemy-conc >=0.13.0.0 && <0.14
+    , polysemy-resume >=0.7 && <0.9
     , polysemy-time ==0.6.*
-    , posix-pty >=0.2
+    , posix-pty ==0.2.*
     , process
     , stm-chans >=3 && <3.1
     , typed-process >=0.2.6 && <0.3
@@ -136,9 +109,9 @@
       base hiding (Prelude)
     , incipit-core (IncipitCore as Prelude)
     , incipit-core hiding (IncipitCore)
-  default-language: Haskell2010
+  default-language: GHC2021
 
-test-suite polysemy-process-unit
+test-suite polysemy-process-test
   type: exitcode-stdio-1.0
   main-is: Main.hs
   other-modules:
@@ -148,81 +121,54 @@
   default-extensions:
       AllowAmbiguousTypes
       ApplicativeDo
-      BangPatterns
-      BinaryLiterals
       BlockArguments
-      ConstraintKinds
       DataKinds
       DefaultSignatures
       DeriveAnyClass
-      DeriveDataTypeable
-      DeriveFoldable
-      DeriveFunctor
-      DeriveGeneric
-      DeriveLift
-      DeriveTraversable
       DerivingStrategies
       DerivingVia
       DisambiguateRecordFields
-      DoAndIfThenElse
       DuplicateRecordFields
-      EmptyCase
-      EmptyDataDecls
-      ExistentialQuantification
-      FlexibleContexts
-      FlexibleInstances
       FunctionalDependencies
       GADTs
-      GeneralizedNewtypeDeriving
-      InstanceSigs
-      KindSignatures
       LambdaCase
       LiberalTypeSynonyms
-      MultiParamTypeClasses
       MultiWayIf
-      NamedFieldPuns
       OverloadedLabels
       OverloadedLists
       OverloadedStrings
       PackageImports
       PartialTypeSignatures
-      PatternGuards
       PatternSynonyms
-      PolyKinds
       QuantifiedConstraints
       QuasiQuotes
-      RankNTypes
       RecordWildCards
       RecursiveDo
       RoleAnnotations
-      ScopedTypeVariables
-      StandaloneDeriving
       TemplateHaskell
-      TupleSections
-      TypeApplications
       TypeFamilies
       TypeFamilyDependencies
-      TypeOperators
-      TypeSynonymInstances
       UndecidableInstances
       UnicodeSyntax
       ViewPatterns
-  ghc-options: -Wall -Wredundant-constraints -Wincomplete-uni-patterns -Wmissing-deriving-strategies -Widentities -Wunused-packages -threaded -rtsopts -with-rtsopts=-N
+      OverloadedRecordDot
+      NoFieldSelectors
+  ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall -Widentities -Wincomplete-uni-patterns -Wmissing-deriving-strategies -Wredundant-constraints -Wunused-type-patterns -Wunused-packages
   build-depends:
-      base >=4.12 && <5
-    , incipit-core >=0.4.1
+      base ==4.*
+    , incipit-core ==0.5.*
     , polysemy
-    , polysemy-conc
-    , polysemy-plugin
+    , polysemy-conc >=0.13.0.0 && <0.14
+    , polysemy-plugin >=0.4.4 && <0.5
     , polysemy-process
-    , polysemy-resume
-    , polysemy-test >=0.6
-    , polysemy-time
-    , tasty
-    , tasty-expected-failure
+    , polysemy-resume >=0.7 && <0.9
+    , polysemy-test >=0.6 && <0.9
+    , polysemy-time ==0.6.*
+    , tasty ==1.4.*
+    , tasty-expected-failure ==0.12.*
     , typed-process
   mixins:
       base hiding (Prelude)
     , incipit-core (IncipitCore as Prelude)
     , incipit-core hiding (IncipitCore)
-  default-language: Haskell2010
+  default-language: GHC2021
diff --git a/test/Polysemy/Process/Test/ProcessTest.hs b/test/Polysemy/Process/Test/ProcessTest.hs
--- a/test/Polysemy/Process/Test/ProcessTest.hs
+++ b/test/Polysemy/Process/Test/ProcessTest.hs
@@ -47,25 +47,25 @@
 test_process :: UnitTest
 test_process =
   runTestAuto $ interpretRace $ asyncToIOFinal $ interpretProcessByteString $ interpretProcessNative_ def config do
-    response <- resumeHoistError @ProcessError @(Scoped _ _) show do
+    response <- resumeHoistError @ProcessError @(Scoped _ _) (TestError . show) do
       withProcess_ do
         Process.send (encodeUtf8 message)
-        Race.timeout_ (throw "timed out") (Seconds 5) Process.recv
+        Race.timeout_ (throw (TestError "timed out")) (Seconds 5) Process.recv
     message === decodeUtf8 response
 
 test_processLines :: UnitTest
 test_processLines =
   runTestAuto $ interpretRace $ asyncToIOFinal $ interpretProcessTextLines $ interpretProcessNative_ def config do
-    response <- resumeHoistError @ProcessError @(Scoped _ _) show do
+    response <- resumeHoistError @ProcessError @(Scoped _ _) (TestError . show) do
       withProcess_ do
         Process.send message
-        Race.timeout_ (throw "timed out") (Seconds 5) (replicateM 4 Process.recv)
+        Race.timeout_ (throw (TestError "timed out")) (Seconds 5) (replicateM 4 Process.recv)
     messageLines === response
 
 test_processKillNever :: UnitTest
 test_processKillNever =
   runTestAuto $ interpretRace $ asyncToIOFinal $ interpretProcessTextLines $ interpretProcessNative_ def { kill = KillNever } config do
-    result <- resumeHoistError @ProcessError @(Scoped _ _) show do
+    result <- resumeHoistError @ProcessError @(Scoped _ _) (TestError . show) do
       Conc.timeout unit (MilliSeconds 100) do
         withProcess_ do
           Process.send message
@@ -110,7 +110,7 @@
 test_processOneshot =
   runTestAuto $ interpretRace $ asyncToIOFinal $ interpretOneshot conf do
     num <- runStop @Int $ withProcessOneshot message do
-      Race.timeout_ (throw "timed out") (Seconds 5) do
+      Race.timeout_ (throw (TestError "timed out")) (Seconds 5) do
         for_ @[] [1..5] \ i ->
           resumeHoistAs i Process.recv
         unit
