diff --git a/Text/ProtocolBuffers/ProtoCompile/Gen.hs b/Text/ProtocolBuffers/ProtoCompile/Gen.hs
--- a/Text/ProtocolBuffers/ProtoCompile/Gen.hs
+++ b/Text/ProtocolBuffers/ProtoCompile/Gen.hs
@@ -341,7 +341,7 @@
 --------------------------------------------
 oneofModule :: Result -> OneofInfo -> Module
 oneofModule result oi
-  = Module src (ModuleName (fqMod protoName)) (modulePragmas False) Nothing
+  = Module src (ModuleName (fqMod protoName)) (modulePragmas $ oneofMakeLenses oi) Nothing
          Nothing imports (oneofDecls oi)
   where protoName = oneofName oi
         typs = mapMaybe typeName . F.toList . fmap snd . oneofFields $ oi
@@ -350,10 +350,15 @@
 
 
 oneofDecls :: OneofInfo -> [Decl]
-oneofDecls oi = (oneofX oi : oneofFuncs oi) ++
-                  [ instanceDefaultOneof oi
-                  , instanceMergeableOneof oi
-                  ]
+oneofDecls oi = (oneofX oi : oneofFuncs oi) ++ lenses ++ instances
+  where
+    mkPrisms = Var (Qual (ModuleName "Control.Lens.TH") (Ident "makePrisms"))
+    lenses | oneofMakeLenses oi = [SpliceDecl src (mkFun $$ TypQuote (unqualName (oneofName oi))) |
+                                   mkFun <- [mkLenses, mkPrisms]]
+           | otherwise = []
+    instances = [ instanceDefaultOneof oi
+                , instanceMergeableOneof oi
+                ]
 
 oneofX :: OneofInfo -> Decl
 oneofX oi = DataDecl src DataType [] (baseIdent (oneofName oi)) []
@@ -685,7 +690,6 @@
                         extendees' ++ mapMaybe typeName (myKeys' ++ (F.toList (fields di)))
                     , concat . mapMaybe (importO result m Normal) $ F.toList (descOneofs di)
                     , mapMaybe (importPFN result m) (map fieldName (myKeys ++ F.toList (knownKeys di))) ]
-        mkLenses = Var (Qual (ModuleName "Control.Lens.TH") (Ident "makeLenses"))
         lenses | makeLenses di = [SpliceDecl src (mkLenses $$ TypQuote (unqualName protoName))]
                | otherwise = []
         declKeys | sepKey = []
@@ -693,17 +697,22 @@
     in Module src m (modulePragmas $ makeLenses di) Nothing (Just (EThingAll un : exportLenses di ++ exportKeys)) imports
          (descriptorX di : lenses ++ declKeys ++ instancesDescriptor di)
 
+mkLenses :: Exp
+mkLenses = Var (Qual (ModuleName "Control.Lens.TH") (Ident "makeLenses"))
+
 exportLenses :: DescriptorInfo -> [ExportSpec]
 exportLenses di =
   if makeLenses di
     then
 #if MIN_VERSION_haskell_src_exts(1, 17, 0)
-      map (EVar . unqualFName . stripPrefix . fieldName) (F.toList (fields di))
+      map (EVar . unqualFName . stripPrefix) (lensFieldNames di)
 #else
-      map (EVar NoNamespace . unqualFName . stripPrefix . fieldName) (F.toList (fields di))
+      map (EVar NoNamespace . unqualFName . stripPrefix) (lensFieldNames di)
 #endif
     else []
   where stripPrefix pfn = pfn { baseNamePrefix' = "" }
+        lensFieldNames di = map fieldName (F.toList (fields di))
+                            ++ map oneofFName (F.toList (descOneofs di))
 
 minimalImports :: [ImportDecl]
 minimalImports =
diff --git a/hprotoc.cabal b/hprotoc.cabal
--- a/hprotoc.cabal
+++ b/hprotoc.cabal
@@ -1,5 +1,5 @@
 name:           hprotoc
-version:        2.2.0
+version:        2.3.0
 cabal-version:  >= 1.6
 build-type:     Simple
 license:        BSD3
@@ -20,8 +20,8 @@
   location: git://github.com/k-bx/protocol-buffers.git
 
 Executable hprotoc
-  build-depends:   protocol-buffers == 2.2.0,
-                   protocol-buffers-descriptor == 2.2.0
+  build-depends:   protocol-buffers == 2.3.0,
+                   protocol-buffers-descriptor == 2.3.0
   Main-Is:         Text/ProtocolBuffers/ProtoCompile.hs
   Hs-Source-Dirs:  .,
                    protoc-gen-haskell
@@ -69,8 +69,8 @@
                    TypeSynonymInstances
 
 Library
-  build-depends:   protocol-buffers == 2.2.0,
-                   protocol-buffers-descriptor == 2.2.0
+  build-depends:   protocol-buffers == 2.3.0,
+                   protocol-buffers-descriptor == 2.3.0
   Hs-Source-Dirs:  .,
                    protoc-gen-haskell
   build-tools:     alex
