diff --git a/Changelog.md b/Changelog.md
--- a/Changelog.md
+++ b/Changelog.md
@@ -1,7 +1,10 @@
 # Changelog for `proto-lens-combinators`
 
+## v0.4.0.0
+- Update to (and require) `proto-lens-0.4.*`.
+
 ## v0.1.0.12
-- Add support for ghc-8.6.
+- Switch to `proto-lens-{setup/runtime}` v0.4.
 
 ## v0.1.0.11
 - Bump the lower bound on `base` to indicate we require `ghc>=8.0`.
diff --git a/proto-lens-combinators.cabal b/proto-lens-combinators.cabal
--- a/proto-lens-combinators.cabal
+++ b/proto-lens-combinators.cabal
@@ -2,10 +2,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 7a0758df4f3edec44050b361e5e9a8dad6b8c81b46fb199d71c85c2cb52b43b4
+-- hash: 6dee157d60bdded5f5b245b2c18c7f4cff2e4fb8a8deec8b89aa190d71b8d60c
 
 name:           proto-lens-combinators
-version:        0.1.0.12
+version:        0.4
 synopsis:       Utilities functions to proto-lens.
 description:    Useful things for working with protos.
 category:       Data
@@ -30,8 +30,8 @@
 custom-setup
   setup-depends:
       Cabal
-    , base >=4.9 && <4.13
-    , proto-lens-protoc ==0.3.*
+    , base >=4.9 && <4.12
+    , proto-lens-setup ==0.4.*
 
 library
   exposed-modules:
@@ -41,10 +41,9 @@
   hs-source-dirs:
       src
   build-depends:
-      base >=4.9 && <4.13
-    , data-default-class >=0.0 && <0.2
+      base >=4.9 && <4.12
     , lens-family ==1.2.*
-    , proto-lens-protoc ==0.3.*
+    , proto-lens ==0.4.*
     , transformers >=0.4 && <0.6
   default-language: Haskell2010
 
@@ -62,7 +61,7 @@
     , lens-family-core
     , proto-lens
     , proto-lens-combinators
-    , proto-lens-protoc
+    , proto-lens-runtime ==0.4.*
     , test-framework
     , test-framework-hunit
   default-language: Haskell2010
diff --git a/src/Data/ProtoLens/Combinators.hs b/src/Data/ProtoLens/Combinators.hs
--- a/src/Data/ProtoLens/Combinators.hs
+++ b/src/Data/ProtoLens/Combinators.hs
@@ -16,7 +16,7 @@
     ) where
 
 import Control.Monad.Trans.State (State, execState)
-import Data.Default.Class (Default(def))
+import Data.ProtoLens (Message(..))
 import Data.Maybe (isJust)
 import Lens.Family2 (LensLike, Phantom, Setter, to, (.~))
 
@@ -33,8 +33,8 @@
 
 -- | Creates a 'Default' and then applies the provided `State` to it.  This is
 -- convenient for creating complicated structures.
-make :: Default def => State def a -> def
-make = modifyInState def
+make :: Message msg => State msg a -> msg
+make = modifyInState defMessage
 
 -- | Allows one to modify a value in the 'State' monad.  Note that this is
 -- just for syntactic convenience with @do@ blocks, e.g.
diff --git a/tests/combinators_test.hs b/tests/combinators_test.hs
--- a/tests/combinators_test.hs
+++ b/tests/combinators_test.hs
@@ -7,7 +7,7 @@
 {-# LANGUAGE OverloadedStrings #-}
 module Main where
 
-import Data.ProtoLens (def)
+import Data.ProtoLens (defMessage)
 import Data.ProtoLens.Combinators
 import Lens.Family ((^.), (.~), (&))
 import Lens.Family.State ((.=), (<~), use, zoom)
@@ -19,7 +19,7 @@
 
 main :: IO ()
 main = defaultMain $ hUnitTestToTests $ "" ~:
-    [ let proto = def & quux .~ 1 & foo .~ def :: Foo
+    [ let proto = defMessage & quux .~ 1 & foo .~ defMessage :: Foo
       in "has" ~:
           [ "True" ~: proto ^. has maybe'quux ~?= True
           , "False" ~: proto ^. has maybe'bar ~?= False
@@ -28,13 +28,13 @@
               , "False" ~: proto ^. has (foo . maybe'buzz) ~?= False
               ]
           ]
-    , let proto = def & quux .~ 2 & foo . fizz .~ 3 :: Foo
+    , let proto = defMessage & quux .~ 2 & foo . fizz .~ 3 :: Foo
       in "clear" ~:
           [ "no-op" ~: clear maybe'bar proto ~?= proto
-          , "scalar" ~: clear maybe'quux proto ~?= (def & foo . fizz .~ 3)
-          , "group" ~: clear maybe'foo proto ~?= (def & quux .~ 2)
+          , "scalar" ~: clear maybe'quux proto ~?= (defMessage & foo . fizz .~ 3)
+          , "group" ~: clear maybe'foo proto ~?= (defMessage & quux .~ 2)
           , "nested" ~: clear (foo . maybe'fizz) proto ~?=
-              (def & quux .~ 2 & foo .~ def)
+              (defMessage & quux .~ 2 & foo .~ defMessage)
           ]
     , let actual :: Foo
           actual = make $ do
@@ -44,13 +44,13 @@
                   fizz .= 5
                   buzz .= "B"
               zoom baz $ return ()
-          expected = def & quux .~ 4 & foo . buzz .~ "A" &
-              bar .~ (def & fizz .~ 5 & buzz .~ "B") & baz .~ def
+          expected = defMessage & quux .~ 4 & foo . buzz .~ "A" &
+              bar .~ (defMessage & fizz .~ 5 & buzz .~ "B") & baz .~ defMessage
       in "make" ~: actual ~?= expected
-    , let original = def & quux .~ 6 & baz . fizz .~ 7 :: Foo
+    , let original = defMessage & quux .~ 6 & baz . fizz .~ 7 :: Foo
           actual = modifyInState original $ do
               bar . fizz <~ use quux
               quux .= 8
-          expected = def & quux .~ 8 & bar . fizz .~ 6 & baz . fizz .~ 7
+          expected = defMessage & quux .~ 8 & bar . fizz .~ 6 & baz . fizz .~ 7
       in "modifyInState" ~: actual ~?= expected
     ]
