diff --git a/CHANGELOG b/CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,8 @@
+# v0.4.0.0
+
+* Add `:*:` type operator and pattern synonym for tuple.
+* Drop GHC < 7.10 support.
+
 # v0.3.0.0
 
 * Add `hasLens`, thanks @pavelkogan!
@@ -9,5 +14,4 @@
 # v0.2.0.0
 
 * Change `get/modify` to `getter/modifier` to reduce naming collision, namely `get/modify` would collide with `MonadState`.
-
 * Add tuple instances up to 12 elements.
diff --git a/Data/Has.hs b/Data/Has.hs
--- a/Data/Has.hs
+++ b/Data/Has.hs
@@ -1,7 +1,8 @@
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE RankNTypes #-}
-{-# LANGUAGE CPP #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE TypeOperators #-}
 
 {-|
 Module      : Data.Has
@@ -64,21 +65,34 @@
 
 @ ... (3 :: Int, "hello" :: String, ...) @
 
--}
+This module also provide infix type operator and pattern synonym of tuple, i.e. inductive procducts,
+which is more convenient to write. An overlapping instance prefer first(left) one is provided:
 
-module Data.Has (Has(..)) where
+@
+> getter (True :*: "hello" :*: 1) :: Integer
+> 1
+> getter (1 :*: 2 :*: 3) :: Integer
+> 1
+@
 
-import Data.Functor
-import Data.Functor.Identity
+-}
 
-#if MIN_VERSION_base(4,9,0)
-import Data.Functor.Const
-#else
-import Data.Functor.Const.Compat
-#endif
+module Data.Has where
 
+import Data.Functor.Identity ( Identity(Identity, runIdentity) )
+import Control.Applicative ( Const(Const, getConst) )
+
 type Lens t a = forall f. Functor f => (a -> f a) -> t -> f t
 
+-- | Infix version of tuple(right associative).
+type a :*: b = (a, b)
+
+-- | Infix pattern alias for tuple(right associative).
+pattern (:*:) :: a -> b -> (a, b)
+pattern a :*: b = (a, b)
+
+infixr 1 :*:
+
 -- | A type class for extensible product.
 --
 -- We provide instances for tuples up to 12 elements by default.
@@ -101,15 +115,16 @@
     modifier = id
     {-# INLINABLE modifier #-}
 
-instance Has a (a, b) where
+instance {-# OVERLAPPING #-} Has a (a, b) where
     getter (a, _) = a
     {-# INLINABLE getter #-}
     modifier f (a, b) = (f a, b)
     {-# INLINABLE modifier #-}
-instance Has b (a, b) where
-    getter (_, b) = b
+
+instance {-# OVERLAPPABLE #-} Has b bs => Has b (a, bs) where
+    getter (_, bs) = getter bs
     {-# INLINABLE getter #-}
-    modifier f (a, b) = (a, f b)
+    modifier f (a, b) = (a, modifier f b)
     {-# INLINABLE modifier #-}
 
 --------------------------------------------------------------------------------
diff --git a/data-has.cabal b/data-has.cabal
--- a/data-has.cabal
+++ b/data-has.cabal
@@ -1,5 +1,5 @@
 name:                data-has
-version:             0.3.0.0
+version:             0.4.0.0
 synopsis:            Simple extensible product
 description:         Simple extensible product
 license:             BSD3
@@ -21,11 +21,7 @@
   exposed-modules:      Data.Has
   -- other-modules:       
   -- other-extensions:    
-  build-depends:       base < 5
-  if impl(ghc < 8)
-    build-depends:       base-compat >= 0.9
-  if impl(ghc < 7.10)
-    build-depends:       transformers
+  build-depends:       base >= 4.8 && < 5
 
   -- hs-source-dirs:      
   default-language:    Haskell2010
