diff --git a/.gitignore b/.gitignore
new file mode 100644
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,58 @@
+dist
+cabal-dev
+*.o
+*.hi
+*.chi
+*.chs.h
+.virtualenv
+.hsenv
+.cabal-sandbox/
+cabal.sandbox.config
+cabal.config
+
+# =========================
+# Operating System Files
+# =========================
+
+# OSX
+# =========================
+
+.DS_Store
+.AppleDouble
+.LSOverride
+
+# Icon must end with two \r
+Icon
+
+# Thumbnails
+._*
+
+# Files that might appear on external disk
+.Spotlight-V100
+.Trashes
+
+# Directories potentially created on remote AFP share
+.AppleDB
+.AppleDesktop
+Network Trash Folder
+Temporary Items
+.apdisk
+
+# Windows
+# =========================
+
+# Windows image file caches
+Thumbs.db
+ehthumbs.db
+
+# Folder config file
+Desktop.ini
+
+# Recycle Bin used on file shares
+$RECYCLE.BIN/
+
+# Windows Installer files
+*.cab
+*.msi
+*.msm
+*.msp
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,1 @@
+language: haskell
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,11 @@
+0.1.3
+---------------------------------
+* Prevent the reckress type checking of GHC so that it works on older GHC and shows sane signature.
+
+0.1.2
+---------------------------------
+* Added `Identity` monad to the default definition of `Floors`.
+
+0.1.1
+---------------------------------
+* Added `elevate = id` pragma for efficiency.
diff --git a/elevator.cabal b/elevator.cabal
--- a/elevator.cabal
+++ b/elevator.cabal
@@ -1,5 +1,5 @@
 name:                elevator
-version:             0.1.2
+version:             0.1.3
 synopsis:            Immediately lifts to a desired level
 description:         This package provides 'elevate' function which composes 'lift'-like transformations automatically.
 homepage:            https://github.com/fumieval/elevator
@@ -10,7 +10,10 @@
 copyright:           Copyright (C) 2014 Fumiaki Kinoshita
 category:            Data
 build-type:          Simple
--- extra-source-files:  
+extra-source-files:
+    CHANGELOG.md
+    .travis.yml
+    .gitignore
 cabal-version:       >=1.10
 
 source-repository head
diff --git a/src/Control/Elevator.hs b/src/Control/Elevator.hs
--- a/src/Control/Elevator.hs
+++ b/src/Control/Elevator.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE CPP, TypeOperators, FlexibleContexts, DefaultSignatures, FlexibleInstances, ConstraintKinds, TypeFamilies, DataKinds #-}
+{-# LANGUAGE CPP, TypeOperators, FlexibleContexts, Rank2Types, DefaultSignatures, FlexibleInstances, ConstraintKinds, TypeFamilies, DataKinds, UndecidableInstances #-}
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Control.Elevator
@@ -41,21 +41,22 @@
 #endif
 
 class Tower f where
-  type Floors f :: List (* -> *)
+  type Floors (f :: * -> *) :: List (* -> *)
   type Floors f = Identity :> Empty
+  type Floors1 f :: List (* -> *)
+  type Floors1 f = f :> Floors f
   toLoft :: Union (Floors f) a -> f a
   default toLoft :: Applicative f => Union (Identity :> Empty) a -> f a
   toLoft = pure . runIdentity ||> exhaust
 
-type Elevate f g = (Tower g, f ∈ Floors1 g)
-
-type Floors1 g = g :> Floors g
+  toLoft1 :: Union (Floors1 f) a -> f a
+  default toLoft1 :: Union (f :> Floors f) a -> f a
+  toLoft1 = id ||> toLoft
 
-toLoft1 :: Tower f => Union (Floors1 f) a -> f a
-toLoft1 = id ||> toLoft
+type Elevate f g = (Tower g, f ∈ Floors1 g)
 
 elevate :: Elevate f g => f a -> g a
-elevate f = (id ||> toLoft) (liftU f)
+elevate f = toLoft1 (liftU f)
 {-# RULES "elevate/id" [~2] elevate = id #-}
 {-# INLINE[2] elevate #-}
 
