diff --git a/protobuf.cabal b/protobuf.cabal
--- a/protobuf.cabal
+++ b/protobuf.cabal
@@ -1,5 +1,5 @@
 name:                protobuf
-version:             0.1.1
+version:             0.1.2
 synopsis:            Google Protocol Buffers via GHC.Generics
 description:
   Google Protocol Buffers via GHC.Generics.
diff --git a/src/Data/ProtocolBuffers/Wire.hs b/src/Data/ProtocolBuffers/Wire.hs
--- a/src/Data/ProtocolBuffers/Wire.hs
+++ b/src/Data/ProtocolBuffers/Wire.hs
@@ -427,20 +427,20 @@
     xs <- decodePackedList getVarInt x
     return . PackedList $ toEnum <$> xs
 
-instance (Foldable f, Enum a) => EncodeWire (Enumeration (f a)) where
-  encodeWire t = traverse_ (encodeWire t . c) . runEnumeration where
+instance (Foldable f, Enum a) => EncodeWire (f (Enumeration a)) where
+  encodeWire t = traverse_ (encodeWire t . c . runEnumeration) where
     c :: a -> Int32
     c = fromIntegral . fromEnum
 
-instance Enum a => DecodeWire (Enumeration (Maybe a)) where
+instance Enum a => DecodeWire (Maybe (Enumeration a)) where
   decodeWire f = c <$> decodeWire f where
-    c :: Int32 -> Enumeration (Maybe a)
-    c = Enumeration . Just . toEnum . fromIntegral
+    c :: Int32 -> Maybe (Enumeration a)
+    c = Just . Enumeration . toEnum . fromIntegral
 
-instance Enum a => DecodeWire (Enumeration (Always a)) where
+instance Enum a => DecodeWire (Always (Enumeration a)) where
   decodeWire f = c <$> decodeWire f where
-    c :: Int32 -> Enumeration (Always a)
-    c = Enumeration . Always . toEnum . fromIntegral
+    c :: Int32 -> Always (Enumeration a)
+    c = Always . Enumeration . toEnum . fromIntegral
 
 -- Taken from google's code, but I had to explcitly add fromIntegral in the right places:
 zzEncode32 :: Int32 -> Word32
diff --git a/tests/Main.hs b/tests/Main.hs
--- a/tests/Main.hs
+++ b/tests/Main.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DeriveDataTypeable #-}
 {-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
@@ -44,6 +45,12 @@
 main :: IO ()
 main = defaultMain tests
 
+data EnumFoo
+  = EnumFoo1
+  | EnumFoo2
+  | EnumFoo3
+    deriving (Bounded, Enum, Eq, Typeable)
+
 tests =
   [ testGroup "Primitive Wire" primitiveWireTests
   , testGroup "Packed Wire" packedWireTests
@@ -74,6 +81,7 @@
   , testProperty "float"    (f (Proxy :: Proxy Float))
   , testProperty "double"   (f (Proxy :: Proxy Double))
   , testProperty "bool"     (f (Proxy :: Proxy Bool))
+  , testProperty "enum"     (f (Proxy :: Proxy (Always (Enumeration EnumFoo))))
   ]
 
 primitiveWireTests :: [Test]
@@ -129,10 +137,18 @@
   arbitrary = Value <$> arbitrary
   shrink (Value x) = fmap Value $ shrink x
 
+instance (Bounded a, Enum a) => Arbitrary (Enumeration a) where
+  arbitrary = Enumeration <$> elements [minBound..maxBound]
+  shrink (Enumeration x) = Enumeration . toEnum <$> shrink (fromEnum x)
+
 instance Arbitrary a => Arbitrary (Pb.Fixed a) where
   arbitrary = Pb.Fixed <$> arbitrary
   shrink (Pb.Fixed x) = fmap Pb.Fixed $ shrink x
 
+instance Arbitrary a => Arbitrary (Always a) where
+  arbitrary = Always <$> arbitrary
+  shrink (Always x) = Always <$> shrink x
+
 instance Arbitrary WireField where
   arbitrary = do
     tag <- choose (0, 536870912)
@@ -362,7 +378,3 @@
 
   assert $     856912304801416  == rt64     856912304801416
   assert $ (-75123905439571256) == rt64 (-75123905439571256)
-
-data Test5 a = Test5{test5_e :: Required D3 (Message a)} deriving Generic -- (Generic, Eq, Show)
-instance (Monoid (Message a), Encode a) => Encode (Test5 a)
-instance (Monoid (Message a), Decode a) => Decode (Test5 a)
