diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,30 +1,28 @@
-Copyright (c) 2014, Marcin Mrotek
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials provided
-      with the distribution.
-
-    * Neither the name of Marcin Mrotek nor the names of other
-      contributors may be used to endorse or promote products derived
-      from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+Copyright (c) 2015, Marcin Mrotek
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+  list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+  this list of conditions and the following disclaimer in the documentation
+  and/or other materials provided with the distribution.
+
+* Neither the name of type-list nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
diff --git a/src/Data/Type/List.hs b/src/Data/Type/List.hs
--- a/src/Data/Type/List.hs
+++ b/src/Data/Type/List.hs
@@ -23,6 +23,7 @@
 
 module Data.Type.List where
 
+import GHC.TypeLits
 import Data.Type.Bool
 import Data.Type.Equality
 import Data.Singletons
@@ -41,15 +42,14 @@
 type instance Apply Map'' f = Map' f
 type instance Apply (Map' f) l = Map f l
 
--- |Length of a type-level list, accesible at runtime.
-class TypeLength xs where
-    typeLength :: sing xs -> Int
+type family Length xs where
+    Length '[] = 0
+    Length (x ': xs) = 1 + (Length xs)
 
-instance TypeLength '[] where
-    typeLength _ = 0
+data Length' :: TyFun [a] Nat -> * where
+    Length' :: Length' l
 
-instance TypeLength xs => TypeLength (x ': xs) where
-    typeLength _ = (typeLength (undefined :: sing xs)) + 1
+type instance Apply Length' xs = Length xs
 
 -- |Insert a type into a type list.
 type family Insert a xs where
@@ -95,7 +95,6 @@
 type instance Apply Remove'' x = Remove' x
 type instance Apply (Remove' x) xs = Remove x xs
 
--- |Set difference of two lists.
 type family Difference xs ys where
     Difference '[] ys = ys
     Difference (x ': xs) ys = Remove x (Difference xs ys)
@@ -109,12 +108,10 @@
 type instance Apply Difference'' xs = Difference' xs
 type instance Apply (Difference' xs) ys = Difference xs ys
 
--- |Helper function for Reverse.
 type family ReverseAcc xs acc where
     ReverseAcc '[] acc = acc
     ReverseAcc (x ': xs) acc = ReverseAcc xs (x ': acc)
 
--- |Reverse a type list.
 type family Reverse xs where
     Reverse xs = ReverseAcc xs '[]
 
@@ -123,21 +120,6 @@
 
 type instance Apply Reverse' xs = Reverse xs
 
--- | Type list intersection. 
-type family Intersection xs ys where
-    Intersection '[] ys = '[]
-    Intersection (x ': xs) (x ': ys) = x ': (Intersection xs ys)
-    Intersection (x ': xs) (y ': ys) = Intersection xs ys
-
-data Intersection'' :: TyFun [k] (TyFun [k] [k] -> *) -> * where
-    Intersection'' :: Intersection'' f
-
-data Intersection' :: [k] -> TyFun [k] [k] -> * where
-    Intersection' :: Intersection' xs f
-
-type instance Apply Intersection'' xs = Intersection' xs
-type instance Apply (Intersection' xs) ys = Intersection xs ys
-
 -- | Type list membership test.
 type family Find x ys where
     Find x '[]       = False
@@ -152,6 +134,21 @@
 
 type instance Apply Find'' x = Find' x
 type instance Apply (Find' x) xs = Find x xs
+
+-- | Type list intersection. 
+type family Intersection xs ys where
+    Intersection '[] ys = '[]
+    Intersection (x ': xs) (x ': ys) = x ': (Intersection xs ys)
+    Intersection (x ': xs) (y ': ys) = If (Find x ys) (x ': (Intersection xs (y ': ys))) (Intersection xs (y ': ys))
+
+data Intersection'' :: TyFun [k] (TyFun [k] [k] -> *) -> * where
+    Intersection'' :: Intersection'' f
+
+data Intersection' :: [k] -> TyFun [k] [k] -> * where
+    Intersection' :: Intersection' xs f
+
+type instance Apply Intersection'' xs = Intersection' xs
+type instance Apply (Intersection' xs) ys = Intersection xs ys
 
 -- |Test if two list do not contain any equal elements.
 type family Distinct xs ys where
diff --git a/type-list.cabal b/type-list.cabal
--- a/type-list.cabal
+++ b/type-list.cabal
@@ -2,7 +2,7 @@
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 name:                type-list
-version:             0.0.0.1
+version:             0.1.0.0
 synopsis:            Operations on type-level lists and tuples.
 description:         Operations on type-level lists and tuples, together with their curried versions.
 license:             BSD3
@@ -15,8 +15,8 @@
 -- extra-source-files:  
 cabal-version:       >=1.10
 source-repository    head
-    type: darcs
-    location: mjm@hub.darcs.net:mjm/type-list
+    type: git
+    location: https://github.com/marcinmrotek/type-list
 
 library
   exposed-modules:     Data.Type.List
