diff --git a/Changelog.md b/Changelog.md
--- a/Changelog.md
+++ b/Changelog.md
@@ -1,5 +1,9 @@
 # Changelog for `proto-lens-combinators`
 
+## v0.1.0.11
+- Bump the lower bound on `base` to indicate we require `ghc>=8.0`.
+- Use autogen-modules. (#196)
+
 ## v0.1.0.10
 - Bump the dependency on `base` for `ghc-8.4.2`.
 
diff --git a/dist/build/autogen/Proto/Combinators.hs b/dist/build/autogen/Proto/Combinators.hs
deleted file mode 100644
--- a/dist/build/autogen/Proto/Combinators.hs
+++ /dev/null
@@ -1,251 +0,0 @@
-{- This file was auto-generated from combinators.proto by the proto-lens-protoc program. -}
-{-# LANGUAGE ScopedTypeVariables, DataKinds, TypeFamilies,
-  UndecidableInstances, GeneralizedNewtypeDeriving,
-  MultiParamTypeClasses, FlexibleContexts, FlexibleInstances,
-  PatternSynonyms, MagicHash, NoImplicitPrelude, DataKinds #-}
-{-# OPTIONS_GHC -fno-warn-unused-imports#-}
-{-# OPTIONS_GHC -fno-warn-duplicate-exports#-}
-module Proto.Combinators (Foo(..), Foo'Bar(..)) where
-import qualified Data.ProtoLens.Reexport.Lens.Labels.Prism
-       as Lens.Labels.Prism
-import qualified Data.ProtoLens.Reexport.Prelude as Prelude
-import qualified Data.ProtoLens.Reexport.Data.Int as Data.Int
-import qualified Data.ProtoLens.Reexport.Data.Word as Data.Word
-import qualified Data.ProtoLens.Reexport.Data.ProtoLens
-       as Data.ProtoLens
-import qualified
-       Data.ProtoLens.Reexport.Data.ProtoLens.Message.Enum
-       as Data.ProtoLens.Message.Enum
-import qualified
-       Data.ProtoLens.Reexport.Data.ProtoLens.Service.Types
-       as Data.ProtoLens.Service.Types
-import qualified Data.ProtoLens.Reexport.Lens.Family2
-       as Lens.Family2
-import qualified Data.ProtoLens.Reexport.Lens.Family2.Unchecked
-       as Lens.Family2.Unchecked
-import qualified Data.ProtoLens.Reexport.Data.Default.Class
-       as Data.Default.Class
-import qualified Data.ProtoLens.Reexport.Data.Text as Data.Text
-import qualified Data.ProtoLens.Reexport.Data.Map as Data.Map
-import qualified Data.ProtoLens.Reexport.Data.ByteString
-       as Data.ByteString
-import qualified Data.ProtoLens.Reexport.Data.ByteString.Char8
-       as Data.ByteString.Char8
-import qualified Data.ProtoLens.Reexport.Lens.Labels as Lens.Labels
-import qualified Data.ProtoLens.Reexport.Text.Read as Text.Read
-
-{- | Fields :
-
-    * 'Proto.Combinators_Fields.quux' @:: Lens' Foo Data.Int.Int32@
-    * 'Proto.Combinators_Fields.maybe'quux' @:: Lens' Foo (Prelude.Maybe Data.Int.Int32)@
-    * 'Proto.Combinators_Fields.foo' @:: Lens' Foo Foo'Bar@
-    * 'Proto.Combinators_Fields.maybe'foo' @:: Lens' Foo (Prelude.Maybe Foo'Bar)@
-    * 'Proto.Combinators_Fields.bar' @:: Lens' Foo Foo'Bar@
-    * 'Proto.Combinators_Fields.maybe'bar' @:: Lens' Foo (Prelude.Maybe Foo'Bar)@
-    * 'Proto.Combinators_Fields.baz' @:: Lens' Foo Foo'Bar@
-    * 'Proto.Combinators_Fields.maybe'baz' @:: Lens' Foo (Prelude.Maybe Foo'Bar)@
- -}
-data Foo = Foo{_Foo'quux :: !(Prelude.Maybe Data.Int.Int32),
-               _Foo'foo :: !(Prelude.Maybe Foo'Bar),
-               _Foo'bar :: !(Prelude.Maybe Foo'Bar),
-               _Foo'baz :: !(Prelude.Maybe Foo'Bar),
-               _Foo'_unknownFields :: !Data.ProtoLens.FieldSet}
-         deriving (Prelude.Show, Prelude.Eq, Prelude.Ord)
-instance (Lens.Labels.HasLens' f Foo x a, a ~ b) =>
-         Lens.Labels.HasLens f Foo Foo x a b
-         where
-        lensOf = Lens.Labels.lensOf'
-instance Prelude.Functor f =>
-         Lens.Labels.HasLens' f Foo "quux" (Data.Int.Int32)
-         where
-        lensOf' _
-          = (Prelude..)
-              (Lens.Family2.Unchecked.lens _Foo'quux
-                 (\ x__ y__ -> x__{_Foo'quux = y__}))
-              (Data.ProtoLens.maybeLens Data.ProtoLens.fieldDefault)
-instance Prelude.Functor f =>
-         Lens.Labels.HasLens' f Foo "maybe'quux"
-           (Prelude.Maybe Data.Int.Int32)
-         where
-        lensOf' _
-          = (Prelude..)
-              (Lens.Family2.Unchecked.lens _Foo'quux
-                 (\ x__ y__ -> x__{_Foo'quux = y__}))
-              Prelude.id
-instance Prelude.Functor f =>
-         Lens.Labels.HasLens' f Foo "foo" (Foo'Bar)
-         where
-        lensOf' _
-          = (Prelude..)
-              (Lens.Family2.Unchecked.lens _Foo'foo
-                 (\ x__ y__ -> x__{_Foo'foo = y__}))
-              (Data.ProtoLens.maybeLens Data.Default.Class.def)
-instance Prelude.Functor f =>
-         Lens.Labels.HasLens' f Foo "maybe'foo" (Prelude.Maybe Foo'Bar)
-         where
-        lensOf' _
-          = (Prelude..)
-              (Lens.Family2.Unchecked.lens _Foo'foo
-                 (\ x__ y__ -> x__{_Foo'foo = y__}))
-              Prelude.id
-instance Prelude.Functor f =>
-         Lens.Labels.HasLens' f Foo "bar" (Foo'Bar)
-         where
-        lensOf' _
-          = (Prelude..)
-              (Lens.Family2.Unchecked.lens _Foo'bar
-                 (\ x__ y__ -> x__{_Foo'bar = y__}))
-              (Data.ProtoLens.maybeLens Data.Default.Class.def)
-instance Prelude.Functor f =>
-         Lens.Labels.HasLens' f Foo "maybe'bar" (Prelude.Maybe Foo'Bar)
-         where
-        lensOf' _
-          = (Prelude..)
-              (Lens.Family2.Unchecked.lens _Foo'bar
-                 (\ x__ y__ -> x__{_Foo'bar = y__}))
-              Prelude.id
-instance Prelude.Functor f =>
-         Lens.Labels.HasLens' f Foo "baz" (Foo'Bar)
-         where
-        lensOf' _
-          = (Prelude..)
-              (Lens.Family2.Unchecked.lens _Foo'baz
-                 (\ x__ y__ -> x__{_Foo'baz = y__}))
-              (Data.ProtoLens.maybeLens Data.Default.Class.def)
-instance Prelude.Functor f =>
-         Lens.Labels.HasLens' f Foo "maybe'baz" (Prelude.Maybe Foo'Bar)
-         where
-        lensOf' _
-          = (Prelude..)
-              (Lens.Family2.Unchecked.lens _Foo'baz
-                 (\ x__ y__ -> x__{_Foo'baz = y__}))
-              Prelude.id
-instance Data.Default.Class.Default Foo where
-        def
-          = Foo{_Foo'quux = Prelude.Nothing, _Foo'foo = Prelude.Nothing,
-                _Foo'bar = Prelude.Nothing, _Foo'baz = Prelude.Nothing,
-                _Foo'_unknownFields = ([])}
-instance Data.ProtoLens.Message Foo where
-        messageName _ = Data.Text.pack "combinators.Foo"
-        fieldsByTag
-          = let quux__field_descriptor
-                  = Data.ProtoLens.FieldDescriptor "quux"
-                      (Data.ProtoLens.ScalarField Data.ProtoLens.Int32Field ::
-                         Data.ProtoLens.FieldTypeDescriptor Data.Int.Int32)
-                      (Data.ProtoLens.OptionalField
-                         (Lens.Labels.lensOf
-                            ((Lens.Labels.proxy#) :: (Lens.Labels.Proxy#) "maybe'quux")))
-                      :: Data.ProtoLens.FieldDescriptor Foo
-                foo__field_descriptor
-                  = Data.ProtoLens.FieldDescriptor "foo"
-                      (Data.ProtoLens.MessageField Data.ProtoLens.MessageType ::
-                         Data.ProtoLens.FieldTypeDescriptor Foo'Bar)
-                      (Data.ProtoLens.OptionalField
-                         (Lens.Labels.lensOf
-                            ((Lens.Labels.proxy#) :: (Lens.Labels.Proxy#) "maybe'foo")))
-                      :: Data.ProtoLens.FieldDescriptor Foo
-                bar__field_descriptor
-                  = Data.ProtoLens.FieldDescriptor "bar"
-                      (Data.ProtoLens.MessageField Data.ProtoLens.MessageType ::
-                         Data.ProtoLens.FieldTypeDescriptor Foo'Bar)
-                      (Data.ProtoLens.OptionalField
-                         (Lens.Labels.lensOf
-                            ((Lens.Labels.proxy#) :: (Lens.Labels.Proxy#) "maybe'bar")))
-                      :: Data.ProtoLens.FieldDescriptor Foo
-                baz__field_descriptor
-                  = Data.ProtoLens.FieldDescriptor "baz"
-                      (Data.ProtoLens.MessageField Data.ProtoLens.MessageType ::
-                         Data.ProtoLens.FieldTypeDescriptor Foo'Bar)
-                      (Data.ProtoLens.OptionalField
-                         (Lens.Labels.lensOf
-                            ((Lens.Labels.proxy#) :: (Lens.Labels.Proxy#) "maybe'baz")))
-                      :: Data.ProtoLens.FieldDescriptor Foo
-              in
-              Data.Map.fromList
-                [(Data.ProtoLens.Tag 1, quux__field_descriptor),
-                 (Data.ProtoLens.Tag 2, foo__field_descriptor),
-                 (Data.ProtoLens.Tag 3, bar__field_descriptor),
-                 (Data.ProtoLens.Tag 4, baz__field_descriptor)]
-        unknownFields
-          = Lens.Family2.Unchecked.lens _Foo'_unknownFields
-              (\ x__ y__ -> x__{_Foo'_unknownFields = y__})
-{- | Fields :
-
-    * 'Proto.Combinators_Fields.fizz' @:: Lens' Foo'Bar Data.Int.Int32@
-    * 'Proto.Combinators_Fields.maybe'fizz' @:: Lens' Foo'Bar (Prelude.Maybe Data.Int.Int32)@
-    * 'Proto.Combinators_Fields.buzz' @:: Lens' Foo'Bar Data.Text.Text@
-    * 'Proto.Combinators_Fields.maybe'buzz' @:: Lens' Foo'Bar (Prelude.Maybe Data.Text.Text)@
- -}
-data Foo'Bar = Foo'Bar{_Foo'Bar'fizz ::
-                       !(Prelude.Maybe Data.Int.Int32),
-                       _Foo'Bar'buzz :: !(Prelude.Maybe Data.Text.Text),
-                       _Foo'Bar'_unknownFields :: !Data.ProtoLens.FieldSet}
-             deriving (Prelude.Show, Prelude.Eq, Prelude.Ord)
-instance (Lens.Labels.HasLens' f Foo'Bar x a, a ~ b) =>
-         Lens.Labels.HasLens f Foo'Bar Foo'Bar x a b
-         where
-        lensOf = Lens.Labels.lensOf'
-instance Prelude.Functor f =>
-         Lens.Labels.HasLens' f Foo'Bar "fizz" (Data.Int.Int32)
-         where
-        lensOf' _
-          = (Prelude..)
-              (Lens.Family2.Unchecked.lens _Foo'Bar'fizz
-                 (\ x__ y__ -> x__{_Foo'Bar'fizz = y__}))
-              (Data.ProtoLens.maybeLens Data.ProtoLens.fieldDefault)
-instance Prelude.Functor f =>
-         Lens.Labels.HasLens' f Foo'Bar "maybe'fizz"
-           (Prelude.Maybe Data.Int.Int32)
-         where
-        lensOf' _
-          = (Prelude..)
-              (Lens.Family2.Unchecked.lens _Foo'Bar'fizz
-                 (\ x__ y__ -> x__{_Foo'Bar'fizz = y__}))
-              Prelude.id
-instance Prelude.Functor f =>
-         Lens.Labels.HasLens' f Foo'Bar "buzz" (Data.Text.Text)
-         where
-        lensOf' _
-          = (Prelude..)
-              (Lens.Family2.Unchecked.lens _Foo'Bar'buzz
-                 (\ x__ y__ -> x__{_Foo'Bar'buzz = y__}))
-              (Data.ProtoLens.maybeLens Data.ProtoLens.fieldDefault)
-instance Prelude.Functor f =>
-         Lens.Labels.HasLens' f Foo'Bar "maybe'buzz"
-           (Prelude.Maybe Data.Text.Text)
-         where
-        lensOf' _
-          = (Prelude..)
-              (Lens.Family2.Unchecked.lens _Foo'Bar'buzz
-                 (\ x__ y__ -> x__{_Foo'Bar'buzz = y__}))
-              Prelude.id
-instance Data.Default.Class.Default Foo'Bar where
-        def
-          = Foo'Bar{_Foo'Bar'fizz = Prelude.Nothing,
-                    _Foo'Bar'buzz = Prelude.Nothing, _Foo'Bar'_unknownFields = ([])}
-instance Data.ProtoLens.Message Foo'Bar where
-        messageName _ = Data.Text.pack "combinators.Foo.Bar"
-        fieldsByTag
-          = let fizz__field_descriptor
-                  = Data.ProtoLens.FieldDescriptor "fizz"
-                      (Data.ProtoLens.ScalarField Data.ProtoLens.Int32Field ::
-                         Data.ProtoLens.FieldTypeDescriptor Data.Int.Int32)
-                      (Data.ProtoLens.OptionalField
-                         (Lens.Labels.lensOf
-                            ((Lens.Labels.proxy#) :: (Lens.Labels.Proxy#) "maybe'fizz")))
-                      :: Data.ProtoLens.FieldDescriptor Foo'Bar
-                buzz__field_descriptor
-                  = Data.ProtoLens.FieldDescriptor "buzz"
-                      (Data.ProtoLens.ScalarField Data.ProtoLens.StringField ::
-                         Data.ProtoLens.FieldTypeDescriptor Data.Text.Text)
-                      (Data.ProtoLens.OptionalField
-                         (Lens.Labels.lensOf
-                            ((Lens.Labels.proxy#) :: (Lens.Labels.Proxy#) "maybe'buzz")))
-                      :: Data.ProtoLens.FieldDescriptor Foo'Bar
-              in
-              Data.Map.fromList
-                [(Data.ProtoLens.Tag 1, fizz__field_descriptor),
-                 (Data.ProtoLens.Tag 2, buzz__field_descriptor)]
-        unknownFields
-          = Lens.Family2.Unchecked.lens _Foo'Bar'_unknownFields
-              (\ x__ y__ -> x__{_Foo'Bar'_unknownFields = y__})
diff --git a/dist/build/autogen/Proto/Combinators_Fields.hs b/dist/build/autogen/Proto/Combinators_Fields.hs
deleted file mode 100644
--- a/dist/build/autogen/Proto/Combinators_Fields.hs
+++ /dev/null
@@ -1,106 +0,0 @@
-{- This file was auto-generated from combinators.proto by the proto-lens-protoc program. -}
-{-# LANGUAGE ScopedTypeVariables, DataKinds, TypeFamilies,
-  UndecidableInstances, GeneralizedNewtypeDeriving,
-  MultiParamTypeClasses, FlexibleContexts, FlexibleInstances,
-  PatternSynonyms, MagicHash, NoImplicitPrelude, DataKinds #-}
-{-# OPTIONS_GHC -fno-warn-unused-imports#-}
-{-# OPTIONS_GHC -fno-warn-duplicate-exports#-}
-module Proto.Combinators_Fields where
-import qualified Data.ProtoLens.Reexport.Prelude as Prelude
-import qualified Data.ProtoLens.Reexport.Data.Int as Data.Int
-import qualified Data.ProtoLens.Reexport.Data.Word as Data.Word
-import qualified Data.ProtoLens.Reexport.Data.ProtoLens
-       as Data.ProtoLens
-import qualified
-       Data.ProtoLens.Reexport.Data.ProtoLens.Message.Enum
-       as Data.ProtoLens.Message.Enum
-import qualified
-       Data.ProtoLens.Reexport.Data.ProtoLens.Service.Types
-       as Data.ProtoLens.Service.Types
-import qualified Data.ProtoLens.Reexport.Lens.Family2
-       as Lens.Family2
-import qualified Data.ProtoLens.Reexport.Lens.Family2.Unchecked
-       as Lens.Family2.Unchecked
-import qualified Data.ProtoLens.Reexport.Data.Default.Class
-       as Data.Default.Class
-import qualified Data.ProtoLens.Reexport.Data.Text as Data.Text
-import qualified Data.ProtoLens.Reexport.Data.Map as Data.Map
-import qualified Data.ProtoLens.Reexport.Data.ByteString
-       as Data.ByteString
-import qualified Data.ProtoLens.Reexport.Data.ByteString.Char8
-       as Data.ByteString.Char8
-import qualified Data.ProtoLens.Reexport.Lens.Labels as Lens.Labels
-import qualified Data.ProtoLens.Reexport.Text.Read as Text.Read
-
-bar ::
-    forall f s t a b . (Lens.Labels.HasLens f s t "bar" a b) =>
-      Lens.Family2.LensLike f s t a b
-bar
-  = Lens.Labels.lensOf
-      ((Lens.Labels.proxy#) :: (Lens.Labels.Proxy#) "bar")
-baz ::
-    forall f s t a b . (Lens.Labels.HasLens f s t "baz" a b) =>
-      Lens.Family2.LensLike f s t a b
-baz
-  = Lens.Labels.lensOf
-      ((Lens.Labels.proxy#) :: (Lens.Labels.Proxy#) "baz")
-buzz ::
-     forall f s t a b . (Lens.Labels.HasLens f s t "buzz" a b) =>
-       Lens.Family2.LensLike f s t a b
-buzz
-  = Lens.Labels.lensOf
-      ((Lens.Labels.proxy#) :: (Lens.Labels.Proxy#) "buzz")
-fizz ::
-     forall f s t a b . (Lens.Labels.HasLens f s t "fizz" a b) =>
-       Lens.Family2.LensLike f s t a b
-fizz
-  = Lens.Labels.lensOf
-      ((Lens.Labels.proxy#) :: (Lens.Labels.Proxy#) "fizz")
-foo ::
-    forall f s t a b . (Lens.Labels.HasLens f s t "foo" a b) =>
-      Lens.Family2.LensLike f s t a b
-foo
-  = Lens.Labels.lensOf
-      ((Lens.Labels.proxy#) :: (Lens.Labels.Proxy#) "foo")
-maybe'bar ::
-          forall f s t a b . (Lens.Labels.HasLens f s t "maybe'bar" a b) =>
-            Lens.Family2.LensLike f s t a b
-maybe'bar
-  = Lens.Labels.lensOf
-      ((Lens.Labels.proxy#) :: (Lens.Labels.Proxy#) "maybe'bar")
-maybe'baz ::
-          forall f s t a b . (Lens.Labels.HasLens f s t "maybe'baz" a b) =>
-            Lens.Family2.LensLike f s t a b
-maybe'baz
-  = Lens.Labels.lensOf
-      ((Lens.Labels.proxy#) :: (Lens.Labels.Proxy#) "maybe'baz")
-maybe'buzz ::
-           forall f s t a b . (Lens.Labels.HasLens f s t "maybe'buzz" a b) =>
-             Lens.Family2.LensLike f s t a b
-maybe'buzz
-  = Lens.Labels.lensOf
-      ((Lens.Labels.proxy#) :: (Lens.Labels.Proxy#) "maybe'buzz")
-maybe'fizz ::
-           forall f s t a b . (Lens.Labels.HasLens f s t "maybe'fizz" a b) =>
-             Lens.Family2.LensLike f s t a b
-maybe'fizz
-  = Lens.Labels.lensOf
-      ((Lens.Labels.proxy#) :: (Lens.Labels.Proxy#) "maybe'fizz")
-maybe'foo ::
-          forall f s t a b . (Lens.Labels.HasLens f s t "maybe'foo" a b) =>
-            Lens.Family2.LensLike f s t a b
-maybe'foo
-  = Lens.Labels.lensOf
-      ((Lens.Labels.proxy#) :: (Lens.Labels.Proxy#) "maybe'foo")
-maybe'quux ::
-           forall f s t a b . (Lens.Labels.HasLens f s t "maybe'quux" a b) =>
-             Lens.Family2.LensLike f s t a b
-maybe'quux
-  = Lens.Labels.lensOf
-      ((Lens.Labels.proxy#) :: (Lens.Labels.Proxy#) "maybe'quux")
-quux ::
-     forall f s t a b . (Lens.Labels.HasLens f s t "quux" a b) =>
-       Lens.Family2.LensLike f s t a b
-quux
-  = Lens.Labels.lensOf
-      ((Lens.Labels.proxy#) :: (Lens.Labels.Proxy#) "quux")
diff --git a/proto-lens-combinators.cabal b/proto-lens-combinators.cabal
--- a/proto-lens-combinators.cabal
+++ b/proto-lens-combinators.cabal
@@ -1,11 +1,11 @@
--- This file has been generated from package.yaml by hpack version 0.20.0.
+-- This file has been generated from package.yaml by hpack version 0.28.2.
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: a9cfc8f9e6ec5f7d4f2af514f3781c0f7142583202d696d75dffbdb5f14eeca1
+-- hash: d9088e01498cf3872011e48a78e3f9c6f331f3c876dca0ead2bdb0d039da5be4
 
 name:           proto-lens-combinators
-version:        0.1.0.10
+version:        0.1.0.11
 synopsis:       Utilities functions to proto-lens.
 description:    Useful things for working with protos.
 category:       Data
@@ -17,8 +17,7 @@
 license:        BSD3
 license-file:   LICENSE
 build-type:     Custom
-cabal-version:  >= 1.10
-
+cabal-version:  >= 1.24
 extra-source-files:
     Changelog.md
     tests/combinators.proto
@@ -31,27 +30,29 @@
 custom-setup
   setup-depends:
       Cabal
-    , base >=4.8 && <4.12
+    , base >=4.9 && <4.12
     , proto-lens-protoc ==0.3.*
 
 library
+  exposed-modules:
+      Data.ProtoLens.Combinators
+  other-modules:
+      Paths_proto_lens_combinators
   hs-source-dirs:
       src
   build-depends:
-      base >=4.8 && <4.12
+      base >=4.9 && <4.12
     , data-default-class >=0.0 && <0.2
     , lens-family ==1.2.*
     , proto-lens-protoc ==0.3.*
     , transformers >=0.4 && <0.6
-  exposed-modules:
-      Data.ProtoLens.Combinators
-  other-modules:
-      Paths_proto_lens_combinators
   default-language: Haskell2010
 
 test-suite combinators_test
   type: exitcode-stdio-1.0
   main-is: combinators_test.hs
+  other-modules:
+      Proto.Combinators Proto.Combinators_Fields
   hs-source-dirs:
       tests
   build-depends:
@@ -64,6 +65,7 @@
     , proto-lens-protoc
     , test-framework
     , test-framework-hunit
-  other-modules:
-      Proto.Combinators Proto.Combinators_Fields
   default-language: Haskell2010
+  autogen-modules:
+    Proto.Combinators
+    Proto.Combinators_Fields
