diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,9 @@
 # Changelog for grpc-etcd-client
 
+## 0.1.2.0
+
+Port to proto-lens-0.4.0.0 . The only breaking change is the re-export of 'Data.Default.Class.def' in favor of 'Data.ProtoLens.Message.defMessage'.
+
 ## 0.1.1.2
 
 Transactions.
diff --git a/grpc-etcd-client.cabal b/grpc-etcd-client.cabal
--- a/grpc-etcd-client.cabal
+++ b/grpc-etcd-client.cabal
@@ -2,10 +2,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: bf4e5b4e26d379b8f85cd5a804c8ec115551d82a89f6e6b5463144e67d7c3c32
+-- hash: d4287d868c7591b9e92461537b002897b2cd17620adeae6e32bdb177a619befb
 
 name:           grpc-etcd-client
-version:        0.1.1.2
+version:        0.1.2.0
 synopsis:       gRPC client for etcd
 description:    Please see the README on GitHub at <https://github.com/lucasdicioccio/etcd-grpc#readme>
 category:       Distributed Computing
@@ -37,12 +37,11 @@
   build-depends:
       base >=4.11 && <5
     , bytestring >=0.10 && <0.11
-    , data-default-class >=0.1 && <0.2
-    , grpc-api-etcd ==0.1.0.1
+    , grpc-api-etcd ==0.2.0.0
     , http2-client >=0.8 && <0.9
-    , http2-client-grpc >=0.5.0.3 && <0.6
+    , http2-client-grpc >=0.5.0.4 && <0.6
     , lens >=4.16 && <4.17
     , network >=2.6 && <2.7
-    , proto-lens >=0.3 && <0.4
-    , proto-lens-protoc >=0.3 && <0.4
+    , proto-lens >=0.4 && <0.5
+    , proto-lens-runtime >=0.4 && <0.5
   default-language: Haskell2010
diff --git a/src/Network/EtcdV3.hs b/src/Network/EtcdV3.hs
--- a/src/Network/EtcdV3.hs
+++ b/src/Network/EtcdV3.hs
@@ -72,15 +72,15 @@
     , resignReq
     , leaderReq
     -- * re-exports
-    , def
+    , defMessage
     , module Control.Lens
     ) where
 
 import Control.Lens
 import Control.Exception (throwIO)
-import Data.Default.Class (def)
 import Data.ByteString (ByteString)
 import qualified Data.ByteString.Char8 as C8
+import Data.ProtoLens.Message (defMessage)
 import Data.Semigroup (Endo)
 import Data.String (IsString)
 import GHC.Int (Int64)
@@ -126,7 +126,7 @@
     rawUnary (RPC :: RPC EtcdRPC.KV "range") grpc (rangeReq r)
 
 rangeReq :: KeyRange -> EtcdRPC.RangeRequest
-rangeReq r = def
+rangeReq r = defMessage
   & EtcdPB.key .~ k0
   & EtcdPB.rangeEnd .~ kend
   where
@@ -166,7 +166,7 @@
   -- ^ TTL for the lease.
   -> EtcdQuery EtcdRPC.LeaseGrantResponse
 grantLease grpc seconds =
-    preview unaryOutput <$> rawUnary (RPC :: RPC EtcdRPC.Lease "leaseGrant") grpc (def & EtcdPB.ttl .~ seconds)
+    preview unaryOutput <$> rawUnary (RPC :: RPC EtcdRPC.Lease "leaseGrant") grpc (defMessage & EtcdPB.ttl .~ seconds)
 
 -- | Opaque lease result.
 --
@@ -188,7 +188,7 @@
   -- ^ A previously-granted lease.
   -> EtcdQuery EtcdRPC.LeaseKeepAliveResponse
 keepAlive grpc (GrantedLease leaseID) =
-    preview unaryOutput <$> rawUnary (RPC :: RPC EtcdRPC.Lease "leaseKeepAlive") grpc (def & EtcdPB.id .~ leaseID)
+    preview unaryOutput <$> rawUnary (RPC :: RPC EtcdRPC.Lease "leaseKeepAlive") grpc (defMessage & EtcdPB.id .~ leaseID)
 
 -----------------------------------------------------------------------------------------
 
@@ -207,7 +207,7 @@
     preview unaryOutput <$> rawUnary (RPC :: RPC EtcdRPC.KV "put") grpc (putReq k v gl)
 
 putReq :: ByteString -> ByteString -> Maybe GrantedLease -> EtcdRPC.PutRequest
-putReq k v gl = def
+putReq k v gl = defMessage
   & EtcdPB.key .~ k
   & EtcdPB.value .~ v
   & EtcdPB.lease .~ (maybe 0 _getGrantedLeaseId gl)
@@ -223,7 +223,7 @@
     rawUnary (RPC :: RPC EtcdRPC.KV "deleteRange") grpc (delReq r)
 
 delReq :: KeyRange -> EtcdRPC.DeleteRangeRequest
-delReq r = def
+delReq r = defMessage
   & EtcdPB.key .~ k0
   & EtcdPB.rangeEnd .~ kend
   where
@@ -251,7 +251,7 @@
   -- ^ Previously-granted lease that will bound the lifetime of the lock ownership.
   -> EtcdQuery LockRPC.LockResponse
 lock grpc n (GrantedLease leaseID) = preview unaryOutput <$>
-    rawUnary (RPC :: RPC LockRPC.Lock "lock") grpc (def & LockPB.name .~ n & LockPB.lease .~ leaseID)
+    rawUnary (RPC :: RPC LockRPC.Lock "lock") grpc (defMessage & LockPB.name .~ n & LockPB.lease .~ leaseID)
 
 unlock
   :: GrpcClient
@@ -260,33 +260,33 @@
   -- ^ Previously-acquired lock.
   -> EtcdQuery LockRPC.UnlockResponse
 unlock grpc (AcquiredLock k) = preview unaryOutput <$>
-    rawUnary (RPC :: RPC LockRPC.Lock "unlock") grpc (def & LockPB.key .~ k)
+    rawUnary (RPC :: RPC LockRPC.Lock "unlock") grpc (defMessage & LockPB.key .~ k)
 
 -----------------------------------------------------------------------------------------
 
 kvEq :: ByteString -> ByteString -> EtcdRPC.Compare
-kvEq k v = def
+kvEq k v = defMessage
   & EtcdPB.target .~ EtcdRPC.Compare'VALUE
   & EtcdPB.result .~ EtcdRPC.Compare'EQUAL
   & EtcdPB.key    .~ k
   & EtcdPB.value  .~ v
 
 kvNeq :: ByteString -> ByteString -> EtcdRPC.Compare
-kvNeq k v = def
+kvNeq k v = defMessage
   & EtcdPB.target .~ EtcdRPC.Compare'VALUE
   & EtcdPB.result .~ EtcdRPC.Compare'NOT_EQUAL
   & EtcdPB.key    .~ k
   & EtcdPB.value  .~ v
 
 kvGt :: ByteString -> ByteString -> EtcdRPC.Compare
-kvGt k v = def
+kvGt k v = defMessage
   & EtcdPB.target .~ EtcdRPC.Compare'VALUE
   & EtcdPB.result .~ EtcdRPC.Compare'GREATER
   & EtcdPB.key    .~ k
   & EtcdPB.value  .~ v
 
 kvLt :: ByteString -> ByteString -> EtcdRPC.Compare
-kvLt k v = def
+kvLt k v = defMessage
   & EtcdPB.target .~ EtcdRPC.Compare'VALUE
   & EtcdPB.result .~ EtcdRPC.Compare'LESS
   & EtcdPB.key    .~ k
@@ -308,12 +308,12 @@
   -> [EtcdRPC.DeleteRangeRequest]
   -> [EtcdRPC.RangeRequest]
   -> EtcdRPC.TxnRequest
-successTxnReq cmps rps drrs rrs = def
+successTxnReq cmps rps drrs rrs = defMessage
   & EtcdPB.compare .~ cmps
   & EtcdPB.success .~ (mconcat [
-          [ def & EtcdPB.maybe'requestPut ?~ rp | rp <- rps ]
-        , [ def & EtcdPB.maybe'requestDeleteRange ?~ drr | drr <- drrs ]
-        , [ def & EtcdPB.maybe'requestRange ?~ rr | rr <- rrs ]
+          [ defMessage & EtcdPB.maybe'requestPut ?~ rp | rp <- rps ]
+        , [ defMessage & EtcdPB.maybe'requestDeleteRange ?~ drr | drr <- drrs ]
+        , [ defMessage & EtcdPB.maybe'requestRange ?~ rr | rr <- rrs ]
         ])
 
 -- | Issue a transaction request, performing many modifications at once.
@@ -335,8 +335,8 @@
   -> [EtcdRPC.WatchCreateRequest'FilterType]
   -> Int64
   -> EtcdRPC.WatchRequest
-watchReq r fs wId = def
-  & EtcdPB.maybe'createRequest ?~ (def
+watchReq r fs wId = defMessage
+  & EtcdPB.maybe'createRequest ?~ (defMessage
       & EtcdPB.key .~ k0
       & EtcdPB.rangeEnd .~ kend
       & EtcdPB.filters .~ fs
@@ -399,7 +399,7 @@
   -> GrantedLease
   -> ByteString
   -> ElectionRPC.CampaignRequest
-campaignReq el gl v = def
+campaignReq el gl v = defMessage
   & ElectionPB.name .~ _getElectionName el
   & ElectionPB.lease .~ _getGrantedLeaseId gl
   & ElectionPB.value .~ v
@@ -426,7 +426,7 @@
   :: LeaderEvidence
   -> ByteString
   -> ElectionRPC.ProclaimRequest
-proclaimReq le v = def
+proclaimReq le v = defMessage
   & ElectionPB.leader .~ _getLeaderKey le
   & ElectionPB.value .~ v
 
@@ -445,7 +445,7 @@
 resignReq
   :: LeaderEvidence
   -> ElectionRPC.ResignRequest
-resignReq le = def
+resignReq le = defMessage
   & ElectionPB.leader .~ _getLeaderKey le
 
 -- | As a bystander of an election, get the proclaimed value.
@@ -461,7 +461,7 @@
 leaderReq
   :: Election
   -> ElectionRPC.LeaderRequest
-leaderReq el = def
+leaderReq el = defMessage
   & ElectionPB.name .~ _getElectionName el
 
 -- | As a bystander of an election, get notified for every proclaimed value.
