diff --git a/CHANGELOG b/CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+0.2.0.3:
+  - Fix #11 "Missing optional enum in incoming message causes decodeMessage to fail"
+
 0.2.0.2:
   - Export {get,put}Varint* from Data.ProtocolBuffers.Internal
 
diff --git a/protobuf.cabal b/protobuf.cabal
--- a/protobuf.cabal
+++ b/protobuf.cabal
@@ -1,5 +1,5 @@
 name:                protobuf
-version:             0.2.0.2
+version:             0.2.0.3
 synopsis:            Google Protocol Buffers via GHC.Generics
 description:
   Google Protocol Buffers via GHC.Generics.
diff --git a/src/Data/ProtocolBuffers/Decode.hs b/src/Data/ProtocolBuffers/Decode.hs
--- a/src/Data/ProtocolBuffers/Decode.hs
+++ b/src/Data/ProtocolBuffers/Decode.hs
@@ -89,7 +89,7 @@
   let tag = fromIntegral $ natVal (Proxy :: Proxy n)
   in case HashMap.lookup tag msg of
     Just val -> K1 . Field . c <$> foldMapM decodeWire val
-    Nothing  -> empty
+    Nothing  -> pure . K1 . Field $ c mempty
 
 instance (DecodeWire a, KnownNat n) => GDecode (K1 i (Field n (OptionalField (Last (Value a))))) where
   gdecode msg = fieldDecode Optional msg <|> pure (K1 mempty)
diff --git a/tests/Main.hs b/tests/Main.hs
--- a/tests/Main.hs
+++ b/tests/Main.hs
@@ -28,6 +28,7 @@
 import Data.ByteString.Char8 ()
 import Data.ProtocolBuffers as Pb
 import Data.ProtocolBuffers.Internal as Pb
+import Data.ProtocolBuffers.Orphans ()
 import Data.HashMap.Strict (HashMap)
 import qualified Data.HashMap.Strict as HashMap
 import Data.Hex
@@ -64,6 +65,9 @@
   , testCase "Google Reference Test2" test2
   , testCase "Google Reference Test3" test3
   , testCase "Google Reference Test4" test4
+  , testCase "Optional Enum Test5: Nothing" test5
+  , testCase "Optional Enum Test5: Just Test5A" test6
+  , testCase "Optional Enum Test5: Just Test5B" test7
   , testCase "Google WireFormatTest ZigZag" wireFormatZZ
   ]
 
@@ -344,6 +348,23 @@
 test4 :: Assertion
 test4 = testSpecific msg =<< unhex "2206038e029ea705" where
   msg = Test4{test4_d = putField [3,270,86942]}
+
+data Test5Enum = Test5A | Test5B deriving (Eq, Show, Enum)
+data Test5 = Test5{test5_e :: Optional 5 (Enumeration Test5Enum)} deriving (Generic, Eq, Show)
+instance Encode Test5
+instance Decode Test5
+
+test5 :: Assertion
+test5 = testSpecific msg =<< unhex "" where
+  msg = Test5{test5_e = putField Nothing}
+
+test6 :: Assertion
+test6 = testSpecific msg =<< unhex "2800" where
+  msg = Test5{test5_e = putField $ Just Test5A }
+
+test7 :: Assertion
+test7 = testSpecific msg =<< unhex "2801" where
+  msg = Test5{test5_e = putField $ Just Test5B }
 
 -- some from http://code.google.com/p/protobuf/source/browse/trunk/src/google/protobuf/wire_format_unittest.cc
 wireFormatZZ :: Assertion
