diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 # Revision history for aws-arn
 
+## 0.3.2.0 -- 2024-08-22
+
+* Use prisms and isos from `microlens-pro`.
+
 ## 0.3.1.0 -- 2023-03-01
 
 * Add `Network.AWS.ARN.S3` with support for S3 bucket and object ARNs.
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -55,8 +55,7 @@
    `test/Network/AWS/ARN/SomeAWSService/Test.hs`
 
 4. Define a `_Foo` `Prism'` that combines the parsing/unparsing
-   functions above. Use the local definitions of prisms in
-   `Network.AWS.ARN.Internal.Lens`:
+   functions above:
 
    ```haskell
    _Function :: Prism' Text Function
@@ -80,22 +79,33 @@
 
 6. Test your work and make a PR.
 
-## Formatters
+## Formatting code
 
 The formatters used in this repo are provided by `shell.nix`:
 
-* `*.hs`: [`ormolu`](https://github.com/tweag/ormolu)
-* `*.cabal`:
+- `*.hs`: [`ormolu`](https://github.com/tweag/ormolu)
+- `*.cabal`:
   [`cabal-fmt`](https://hackage.haskell.org/package/cabal-fmt)
   (`cabal-fmt --inplace aws-arn.cabal`)
-* `*.nix`:
+- `*.nix`:
   [`nixpkgs-fmt`](https://github.com/nix-community/nixpkgs-fmt)
   (`nixpkgs-fmt *.nix`)
 
-## Regenerate CI
+## Regenerating CI
 
 This repo uses `haskell-ci`, which is provided by `shell.nix`:
 
 ```shell
 haskell-ci regenerate
 ```
+
+### Fixing CI not being able to install tools
+
+So you ran the above command but `haskell-ci` couldn't install one of its tools
+(e.g. `hlint`, `doctest`) due to version incompatibilities. `haskell-ci`
+selects particular versions by default, but this can be changed with command
+line flags (e.g. `--hlint-version '>=3.5 && <3.6'`, `--doctest-version ==0.20.1`).
+If you do this, please check
+[`haskell-ci`](https://github.com/haskell-CI/haskell-ci); if the HEAD version
+does not select the latest version of a tool, please contribute a PR to that
+repository.
diff --git a/aws-arn.cabal b/aws-arn.cabal
--- a/aws-arn.cabal
+++ b/aws-arn.cabal
@@ -1,11 +1,10 @@
-cabal-version:      2.2
-name:               aws-arn
-version:            0.3.1.0
+cabal-version:   2.2
+name:            aws-arn
+version:         0.3.2.0
 synopsis:
   Types and optics for manipulating Amazon Resource Names (ARNs)
 
 description:
-
   This library provides a type representing [Amazon Resource Names
   (ARNs)](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html),
   and parsing/unparsing functions for them. The provided prisms, when
@@ -26,21 +25,20 @@
   add this support for more AWS resource types are __especially__
   welcome.
 
-bug-reports:        http://github.com/bellroy/aws-arn/issues
-license:            BSD-3-Clause
-license-file:       LICENSE
-author:             Bellroy Tech Team <haskell@bellroy.com>
-maintainer:         Bellroy Tech Team <haskell@bellroy.com>
-copyright:          Copyright (C) 2020-2022 Bellroy Pty Ltd
-category:           AWS, Cloud
-build-type:         Simple
-extra-source-files:
+bug-reports:     http://github.com/bellroy/aws-arn/issues
+license:         BSD-3-Clause
+license-file:    LICENSE
+author:          Bellroy Tech Team <haskell@bellroy.com>
+maintainer:      Bellroy Tech Team <haskell@bellroy.com>
+copyright:       Copyright (C) 2020-2022 Bellroy Pty Ltd
+category:        AWS, Cloud
+build-type:      Simple
+extra-doc-files:
   CHANGELOG.md
   README.md
 
--- Once hlint supports GHC 9.2.2, we can add it to tested-with;
--- Otherwise a hlint build failure breaks CI.
-tested-with:        GHC ==8.6.5 || ==8.8.4 || ==8.10.7 || ==9.0.2
+tested-with:
+  GHC ==8.10.7 || ==9.0.2 || ==9.2.5 || ==9.4.5 || ==9.6.6 || ==9.8.2
 
 common opts
   default-language: Haskell2010
@@ -53,21 +51,21 @@
 
 common deps
   build-depends:
-    , base             >=4.12   && <4.18
+    , base             >=4.12   && <4.20
     , deriving-compat  >=0.5.10 && <0.7
+    , microlens-pro    ^>=0.2
     , profunctors      >=5.0    && <5.7
     , tagged           ^>=0.8
-    , text             ^>=1.2.3 || ^>=2.0
+    , text             ^>=1.2.3 || ^>=2.0 || ^>=2.1
 
 library
   import:          opts, deps
   exposed-modules:
     Network.AWS.ARN
-    Network.AWS.ARN.Internal.Lens
     Network.AWS.ARN.Lambda
     Network.AWS.ARN.S3
 
-  build-depends:   hashable >=1.3.0.0 && <1.5
+  build-depends:   hashable >=1.3.0.0 && <1.6
   hs-source-dirs:  src
 
 test-suite spec
@@ -83,7 +81,7 @@
   ghc-options:        -threaded
   build-depends:
     , aws-arn
-    , tasty        ^>=1.4.0.2
+    , tasty        ^>=1.4.0.2  || ^>=1.5
     , tasty-hunit  ^>=0.10.0.3
 
   build-tool-depends: tasty-discover:tasty-discover >=4.2.2 && <5.1
diff --git a/src/Network/AWS/ARN.hs b/src/Network/AWS/ARN.hs
--- a/src/Network/AWS/ARN.hs
+++ b/src/Network/AWS/ARN.hs
@@ -64,13 +64,13 @@
 import Data.Text (Text)
 import qualified Data.Text as T
 import GHC.Generics (Generic, Generic1)
-import Network.AWS.ARN.Internal.Lens (Iso', Prism', iso, prism')
+import Lens.Micro.Pro (Iso', Prism', iso, prism')
 import Text.Show.Deriving (deriveShow1)
 
 -- $setup
 -- >>> :set -XOverloadedStrings
 -- >>> import Data.Function ((&))
--- >>> import Network.AWS.ARN.Internal.Lens (from, ix, (.~), (^.), (^?))
+-- >>> import Lens.Micro.Pro (from, ix, (.~), (^.), (^?))
 
 -- | A parsed ARN. Either use the '_ARN' 'Prism'', or the 'parseARN' and
 -- 'renderARN' functions to convert @'Text' \<-\> 'ARN'@.  The
diff --git a/src/Network/AWS/ARN/Internal/Lens.hs b/src/Network/AWS/ARN/Internal/Lens.hs
deleted file mode 100644
--- a/src/Network/AWS/ARN/Internal/Lens.hs
+++ /dev/null
@@ -1,97 +0,0 @@
-{-# LANGUAGE RankNTypes #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-
--- |
---
--- Module      : Network.AWS.ARN.Internal.Lens
--- Copyright   : (C) 2020-2022 Bellroy Pty Ltd
--- License     : BSD-3-Clause
--- Maintainer  : Bellroy Tech Team <haskell@bellroy.com>
--- Stability   : experimental
---
--- Reimplement a few lens types and combinators to keep the dependency
--- footprint down.
-module Network.AWS.ARN.Internal.Lens where
-
-import Data.Functor.Const (Const (..))
-import Data.Functor.Identity (Identity (..))
-import Data.Monoid (First (..))
-import Data.Profunctor (Profunctor (..))
-import Data.Profunctor.Choice (Choice (..))
-import Data.Tagged (Tagged (..))
-
-type Lens' s a = forall f. Functor f => (a -> f a) -> s -> f s
-
-type Getting r s a = (a -> Const r a) -> s -> Const r s
-
-type Setter s a = (a -> Identity a) -> s -> Identity s
-
-set :: Setter s a -> a -> s -> s
-set l = over l . const
-{-# INLINE set #-}
-
-(.~) :: Setter s a -> a -> s -> s
-(.~) = set
-
-infixr 4 .~
-
-over :: Setter s a -> (a -> a) -> s -> s
-over l f = runIdentity . l (Identity . f)
-{-# INLINE over #-}
-
-(^.) :: s -> Getting a s a -> a
-s ^. l = getConst $ l Const s
-
-infixl 8 ^.
-
-type Prism' s a =
-  forall p f. (Choice p, Applicative f) => p a (f a) -> p s (f s)
-
-prism' :: forall s a. (a -> s) -> (s -> Maybe a) -> Prism' s a
-prism' inj prj p = dimap prj' inj' $ right' p
-  where
-    inj' :: Applicative f => Either s (f a) -> f s
-    inj' = either pure (fmap inj)
-
-    prj' :: s -> Either s a
-    prj' s = maybe (Left s) Right $ prj s
-{-# INLINE prism' #-}
-
-preview :: Prism' s a -> s -> Maybe a
-preview p s = (getFirst . getConst . ($ s)) $ p (Const . First . Just)
-{-# INLINE preview #-}
-
-review :: Prism' s a -> a -> s
-review p = runIdentity . unTagged . p . Tagged . Identity
-{-# INLINE review #-}
-
-(^?) :: s -> Prism' s a -> Maybe a
-s ^? p = preview p s
-{-# INLINE (^?) #-}
-
-infixl 8 ^?
-
-type Traversal' s a = forall f. Applicative f => (a -> f a) -> s -> f s
-
-ix :: Int -> Traversal' [a] a
-ix 0 f (x : xs) = (: xs) <$> f x
-ix n f (x : xs) = (x :) <$> ix (n - 1) f xs
-ix _ _ [] = pure []
-
-type Iso' s a = forall p f. (Profunctor p, Functor f) => p a (f a) -> p s (f s)
-
-type AnIso' s a = Exchange a a a (Identity a) -> Exchange a a s (Identity s)
-
-data Exchange a b s t = Exchange (s -> a) (b -> t)
-
-instance Profunctor (Exchange a b) where
-  dimap f g (Exchange sa bt) = Exchange (sa . f) (g . bt)
-
-iso :: (s -> a) -> (a -> s) -> Iso' s a
-iso f t = dimap f (fmap t)
-{-# INLINE iso #-}
-
-from :: AnIso' s a -> Iso' a s
-from l = iso (runIdentity . t) f
-  where
-    Exchange f t = l $ Exchange id Identity
diff --git a/src/Network/AWS/ARN/Lambda.hs b/src/Network/AWS/ARN/Lambda.hs
--- a/src/Network/AWS/ARN/Lambda.hs
+++ b/src/Network/AWS/ARN/Lambda.hs
@@ -26,11 +26,11 @@
 import Data.Text (Text)
 import qualified Data.Text as T
 import GHC.Generics (Generic)
-import Network.AWS.ARN.Internal.Lens (Prism', prism')
+import Lens.Micro.Pro (Prism', prism')
 
 -- $setup
 -- >>> :set -XOverloadedStrings
--- >>> import Network.AWS.ARN.Internal.Lens ((^?))
+-- >>> import Lens.Micro.Pro ((^?))
 
 -- | An AWS Lambda function name, and optional alias/version qualifier.
 --
diff --git a/src/Network/AWS/ARN/S3.hs b/src/Network/AWS/ARN/S3.hs
--- a/src/Network/AWS/ARN/S3.hs
+++ b/src/Network/AWS/ARN/S3.hs
@@ -34,11 +34,11 @@
 import Data.Text (Text)
 import qualified Data.Text as T
 import GHC.Generics (Generic)
-import Network.AWS.ARN.Internal.Lens (Prism', prism')
+import Lens.Micro.Pro (Prism', prism')
 
 -- $setup
 -- >>> :set -XOverloadedStrings
--- >>> import Network.AWS.ARN.Internal.Lens ((^?))
+-- >>> import Lens.Micro.Pro ((^?))
 
 -- | An AWS S3 object, made of a bucket and an object key.
 --
diff --git a/test/Network/AWS/ARN/Lambda/Test.hs b/test/Network/AWS/ARN/Lambda/Test.hs
--- a/test/Network/AWS/ARN/Lambda/Test.hs
+++ b/test/Network/AWS/ARN/Lambda/Test.hs
@@ -4,7 +4,7 @@
 module Network.AWS.ARN.Lambda.Test where
 
 import Data.Text (Text)
-import Network.AWS.ARN.Internal.Lens (Lens', set, (^?))
+import Lens.Micro.Pro (Lens', set, (^?))
 import Network.AWS.ARN.Lambda
 import Test.Tasty
 import Test.Tasty.HUnit
diff --git a/test/Network/AWS/ARN/S3/Test.hs b/test/Network/AWS/ARN/S3/Test.hs
--- a/test/Network/AWS/ARN/S3/Test.hs
+++ b/test/Network/AWS/ARN/S3/Test.hs
@@ -4,7 +4,7 @@
 module Network.AWS.ARN.S3.Test where
 
 import Data.Text (Text)
-import Network.AWS.ARN.Internal.Lens (Lens', set, (^?))
+import Lens.Micro.Pro (Lens', set, (^?))
 import Network.AWS.ARN.S3
 import Test.Tasty
 import Test.Tasty.HUnit
@@ -28,8 +28,8 @@
                 set (_Object . rObjectKey) "my/other/object" "bucket-name/my/object"
                   @?= "bucket-name/my/other/object"
             ]
-        ]
-    , testGroup
+        ],
+      testGroup
         "S3 bucket"
         [ testGroup
             "parsing"
diff --git a/test/Network/AWS/ARN/Test.hs b/test/Network/AWS/ARN/Test.hs
--- a/test/Network/AWS/ARN/Test.hs
+++ b/test/Network/AWS/ARN/Test.hs
@@ -5,8 +5,8 @@
 
 import Data.List.NonEmpty (NonEmpty (..))
 import Data.Text (Text)
+import Lens.Micro.Pro (Lens', over, preview, review)
 import Network.AWS.ARN
-import Network.AWS.ARN.Internal.Lens (Lens', over, preview, review)
 import Test.Tasty
 import Test.Tasty.HUnit
 
