diff --git a/CHANGELOG.markdown b/CHANGELOG.markdown
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.markdown
@@ -0,0 +1,7 @@
+0.4.4
+-----
+* Actually working polymorphic kind support
+
+0.4.3
+-----
+* Added polymorphic kind support
diff --git a/Data/Proxy.hs b/Data/Proxy.hs
--- a/Data/Proxy.hs
+++ b/Data/Proxy.hs
@@ -2,13 +2,13 @@
 #ifdef LANGUAGE_DeriveDataTypeable
 {-# LANGUAGE DeriveDataTypeable #-}
 #endif
-#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ > 706
+#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ >= 706
 {-# LANGUAGE PolyKinds #-}
 #endif
 ----------------------------------------------------------------------------
 -- |
 -- Module     : Data.Proxy
--- Copyright  : 2009-2011 Edward Kmett
+-- Copyright  : 2009-2012 Edward Kmett
 -- License    : BSD3
 --
 -- Maintainer  : Edward Kmett <ekmett@gmail.com>
@@ -16,7 +16,6 @@
 -- Portability : portable
 --
 -------------------------------------------------------------------------------
-
 module Data.Proxy
     (
     -- * Tagged values
@@ -31,23 +30,59 @@
 import Control.Applicative (Applicative(..))
 import Data.Traversable (Traversable(..))
 import Data.Foldable (Foldable(..))
-#ifdef LANGUAGE_DeriveDataTypeable
-import Data.Data (Data,Typeable)
-#endif
 import Data.Ix (Ix(..))
 import Data.Tagged
 import Data.Monoid
 #ifdef __GLASGOW_HASKELL__
 import GHC.Arr (unsafeIndex, unsafeRangeSize)
+import Data.Data
 #endif
 
-data Proxy p = Proxy deriving
-  ( Eq, Ord, Show, Read
-#ifdef LANGUAGE_DeriveDataTypeable
-  , Data, Typeable
+data Proxy s = Proxy
+
+instance Eq (Proxy s) where
+  _ == _ = True
+
+instance Ord (Proxy s) where
+  compare _ _ = EQ
+
+instance Show (Proxy s) where
+  showsPrec _ _ = showString "Proxy"
+
+instance Read (Proxy s) where
+  readsPrec d = readParen (d > 10) (\r -> [(Proxy, s) | ("Proxy",s) <- lex r ])
+
+#ifdef __GLASGOW_HASKELL__
+
+instance Typeable1 Proxy where
+  typeOf1 _ = mkTyConApp proxyTyCon []
+
+proxyTyCon :: TyCon
+#if __GLASGOW_HASKELL__ < 704
+proxyTyCon = mkTyCon "Data.Proxy.Proxy"
+#else
+proxyTyCon = mkTyCon3 "tagged" "Data.Proxy" "Proxy"
 #endif
-  )
+{-# NOINLINE proxyTyCon #-}
 
+instance Data s => Data (Proxy s) where
+  gfoldl _ z _ = z Proxy
+  toConstr _ = proxyConstr
+  gunfold _ z c = case constrIndex c of
+    1 -> z Proxy
+    _ -> error "gunfold"
+  dataTypeOf _ = proxyDataType
+  dataCast1 f = gcast1 f
+
+proxyConstr :: Constr
+proxyConstr = mkConstr proxyDataType "Proxy" [] Prefix
+{-# NOINLINE proxyConstr #-}
+
+proxyDataType :: DataType
+proxyDataType = mkDataType "Data.Proxy.Proxy" [proxyConstr]
+{-# NOINLINE proxyDataType #-}
+#endif
+
 instance Enum (Proxy s) where
     succ _ = error "Proxy.succ"
     pred _ = error "Proxy.pred"
@@ -58,19 +93,6 @@
     enumFromThen _ _ = [Proxy]
     enumFromThenTo _ _ _ = [Proxy]
     enumFromTo _ _ = [Proxy]
-
-{-
-Work around for the following GHC bug with deriving Ix instances with a phantom type:
-
-Data/Tagged.hs:1:0:
-    Expecting an ordinary type, but found a type of kind * -> *
-    In an expression type signature: Proxy
-    In the expression: ghc-prim:GHC.Prim.tagToEnum# a :: Proxy
-    In the definition of `Data.Tagged.$tag2con_Proxy':
-        Data.Tagged.$tag2con_Proxy (ghc-prim:GHC.Types.I# a)
-                                     = ghc-prim:GHC.Prim.tagToEnum# a :: Proxy
-
--}
 
 instance Ix (Proxy s) where
     range _ = [Proxy]
diff --git a/Data/Tagged.hs b/Data/Tagged.hs
--- a/Data/Tagged.hs
+++ b/Data/Tagged.hs
@@ -2,13 +2,13 @@
 #ifdef LANGUAGE_DeriveDataTypeable
 {-# LANGUAGE DeriveDataTypeable #-}
 #endif
-#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ > 706
+#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ >= 706
 {-# LANGUAGE PolyKinds #-}
 #endif
 ----------------------------------------------------------------------------
 -- |
 -- Module     : Data.Tagged
--- Copyright  : 2009-2011 Edward Kmett
+-- Copyright  : 2009-2012 Edward Kmett
 -- License    : BSD3
 --
 -- Maintainer  : Edward Kmett <ekmett@gmail.com>
@@ -32,8 +32,8 @@
 import Control.Monad (liftM)
 import Data.Traversable (Traversable(..))
 import Data.Foldable (Foldable(..))
-#ifdef LANGUAGE_DeriveDataTypeable
-import Data.Data (Data,Typeable)
+#ifdef __GLASGOW_HASKELL__
+import Data.Data
 #endif
 import Data.Ix (Ix(..))
 import Data.Monoid
@@ -45,14 +45,40 @@
 --
 -- Moreover, you don't have to rely on the compiler to inline away the extra
 -- argument, because the newtype is \"free\"
-
 newtype Tagged s b = Tagged { unTagged :: b } deriving
   ( Eq, Ord, Ix, Bounded
-#ifdef LANGUAGE_DeriveDataTypeable
-  , Data, Typeable
-#endif
   )
 
+#ifdef __GLASGOW_HASKELL__
+instance Typeable2 Tagged where
+  typeOf2 _ = mkTyConApp taggedTyCon []
+
+taggedTyCon :: TyCon
+#if __GLASGOW_HASKELL__ < 704
+taggedTyCon = mkTyCon "Data.Tagged.Tagged"
+#else
+taggedTyCon = mkTyCon3 "tagged" "Data.Tagged" "Tagged"
+#endif
+
+instance (Data s, Data b) => Data (Tagged s b) where
+  gfoldl f z (Tagged b) = z Tagged `f` b
+  toConstr _ = taggedConstr
+  gunfold k z c = case constrIndex c of
+    1 -> k (z Tagged)
+    _ -> error "gunfold"
+  dataTypeOf _ = taggedDataType
+  dataCast1 f = gcast1 f
+  dataCast2 f = gcast2 f
+
+taggedConstr :: Constr
+taggedConstr = mkConstr taggedDataType "Tagged" [] Prefix
+{-# INLINE taggedConstr #-}
+
+taggedDataType :: DataType
+taggedDataType = mkDataType "Data.Tagged.Tagged" [taggedConstr]
+{-# INLINE taggedDataType #-}
+#endif
+
 instance Show b => Show (Tagged s b) where
     showsPrec n (Tagged b) = showParen (n > 10) $
         showString "Tagged " .
@@ -195,9 +221,11 @@
 -- Idiomatic usage is to make a new combinator for the relationship between the
 -- tags that you want to enforce, and define that combinator using 'retag'.
 --
--- > data Succ n
--- > retagSucc :: Tagged n a -> Tagged (Succ n) a
--- > retagSucc = retag
+-- @
+-- data Succ n
+-- retagSucc :: 'Tagged' n a -> 'Tagged' (Succ n) a
+-- retagSucc = 'retag'
+-- @
 retag :: Tagged s b -> Tagged t b
 retag = Tagged . unTagged
 {-# INLINE retag #-}
diff --git a/README.markdown b/README.markdown
new file mode 100644
--- /dev/null
+++ b/README.markdown
@@ -0,0 +1,4 @@
+tagged
+======
+
+Values carrying an extra [phantom type](http://www.haskell.org/haskellwiki/Phantom_type) tag. 
diff --git a/tagged.cabal b/tagged.cabal
--- a/tagged.cabal
+++ b/tagged.cabal
@@ -1,5 +1,5 @@
 name:           tagged
-version:        0.4.3
+version:        0.4.4
 license:        BSD3
 license-file:   LICENSE
 author:         Edward A. Kmett
@@ -13,7 +13,7 @@
 description:    Haskell 98 phantom types to avoid unsafely passing dummy arguments
 build-type:     Simple
 cabal-version:  >= 1.10
-extra-source-files: .travis.yml
+extra-source-files: .travis.yml CHANGELOG.markdown README.markdown
 
 source-repository head
   type: git
