diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,11 @@
+## [0.4.2]
+### Added
+- Query `Impulse` for `Constraints`
+- Exposed the `CollisionType` Component
+
+### Changed
+- Fixed `ConstraintList` to actually yield constraints instead of shapes
+
 ## [0.4.1]
 ### Changed
 - Fix Point Query bug, should no longer give memory issues
diff --git a/apecs-physics.cabal b/apecs-physics.cabal
--- a/apecs-physics.cabal
+++ b/apecs-physics.cabal
@@ -1,5 +1,5 @@
 name:                apecs-physics
-version:             0.4.1
+version:             0.4.2
 synopsis:            2D physics for apecs
 description:         2D physics for apecs. Uses Chipmunk physics library under the hood.
 homepage:            https://github.com/jonascarpay/apecs#readme
diff --git a/src/Apecs/Physics.hs b/src/Apecs/Physics.hs
--- a/src/Apecs/Physics.hs
+++ b/src/Apecs/Physics.hs
@@ -17,11 +17,12 @@
 
   -- * Shape
   Convex (..), Shape (..),
-  Mass (..), Density (..), Sensor (..), Friction (..), Elasticity (..), SurfaceVelocity (..), CollisionFilter (..),
+  Mass (..), Density (..), Sensor (..), Friction (..), Elasticity (..), SurfaceVelocity (..),
+  CollisionFilter (..), CollisionType(..),
   Bitmask (..), maskAll, maskNone, maskList, defaultFilter, boxShape,
 
   -- * Constraint
-  Constraint (..), ConstraintType (..), MaxForce (..), MaxBias (..), ErrorBias (..), CollideBodies (..),
+  Constraint (..), ConstraintType (..), MaxForce (..), MaxBias (..), ErrorBias (..), Impulse (..), CollideBodies (..),
 
   -- * Collision
   Collision (..), CollisionHandler (..), defaultHandler,
diff --git a/src/Apecs/Physics/Body.hs b/src/Apecs/Physics/Body.hs
--- a/src/Apecs/Physics/Body.hs
+++ b/src/Apecs/Physics/Body.hs
@@ -432,5 +432,5 @@
 instance ExplGet IO (Space ConstraintList) where
   explExists s ety = explExists (cast s :: Space Body) ety
   explGet (Space bMap _ _ _ _) ety = do
-    Just (BodyRecord _ _ sPtr _) <- M.lookup ety <$> readIORef bMap
-    ConstraintList . fmap Entity . S.toList <$> readIORef sPtr
+    Just (BodyRecord _ _ _ cPtr) <- M.lookup ety <$> readIORef bMap
+    ConstraintList . fmap Entity . S.toList <$> readIORef cPtr
diff --git a/src/Apecs/Physics/Collision.hs b/src/Apecs/Physics/Collision.hs
--- a/src/Apecs/Physics/Collision.hs
+++ b/src/Apecs/Physics/Collision.hs
@@ -82,8 +82,10 @@
 newCollisionHandler spcPtr (CollisionHandler source begin separate presolve postsolve) (fromIntegral -> ety) =
   withForeignPtr spcPtr $ \space -> do
     handler <- case source of
-                 Between cta ctb -> [C.exp| cpCollisionHandler* {cpSpaceAddCollisionHandler($(cpSpace* space), $(unsigned int cta), $(unsigned int ctb))}|]
-                 Wildcard ct     -> [C.exp| cpCollisionHandler* {cpSpaceAddWildcardHandler($(cpSpace* space), $(unsigned int ct))}|]
+      Between (CollisionType cta) (CollisionType ctb)
+        -> [C.exp| cpCollisionHandler* {cpSpaceAddCollisionHandler($(cpSpace* space), $(uintptr_t cta), $(uintptr_t ctb))}|]
+      Wildcard (CollisionType ct)
+        -> [C.exp| cpCollisionHandler* {cpSpaceAddWildcardHandler($(cpSpace* space), $(uintptr_t ct))}|]
 
     [C.exp| void { $(cpCollisionHandler* handler)->userData = (void*) $(intptr_t ety) }|]
 
diff --git a/src/Apecs/Physics/Constraint.hs b/src/Apecs/Physics/Constraint.hs
--- a/src/Apecs/Physics/Constraint.hs
+++ b/src/Apecs/Physics/Constraint.hs
@@ -275,6 +275,25 @@
     Just (Record c _) <- M.lookup ety <$> readIORef cMap
     ErrorBias <$> getErrorBias c
 
+-- Impulse
+getImpulse :: Ptr Constraint -> IO Double
+getImpulse c = realToFrac <$> [C.exp| double { cpConstraintGetImpulse ($(cpConstraint* c)) } |]
+
+instance Component Impulse where
+  type Storage Impulse = Space Impulse
+
+instance Has w IO Physics => Has w IO Impulse where
+  getStore = (cast :: Space Physics -> Space Impulse) <$> getStore
+
+instance ExplMembers IO (Space Impulse) where
+  explMembers s = explMembers (cast s :: Space Constraint)
+
+instance ExplGet IO (Space Impulse) where
+  explExists s ety = explExists (cast s :: Space Constraint) ety
+  explGet (Space _ _ cMap _ _) ety = do
+    Just (Record c _) <- M.lookup ety <$> readIORef cMap
+    Impulse <$> getImpulse c
+
 -- CollideBodies
 getCollideBodies :: Ptr Constraint -> IO Bool
 getCollideBodies c = do
diff --git a/src/Apecs/Physics/Shape.hs b/src/Apecs/Physics/Shape.hs
--- a/src/Apecs/Physics/Shape.hs
+++ b/src/Apecs/Physics/Shape.hs
@@ -140,9 +140,9 @@
   explMembers s = explMembers (cast s :: Space Shape)
 
 instance ExplSet IO (Space Sensor) where
-  explSet (Space _ sMap _ _ _) ety (Sensor vec) = do
+  explSet (Space _ sMap _ _ _) ety (Sensor isSensor) = do
     rd <- M.lookup ety <$> readIORef sMap
-    forM_ rd$ \(Record s _) -> setSensor s vec
+    forM_ rd$ \(Record s _) -> setSensor s isSensor
 
 instance ExplGet IO (Space Sensor) where
   explExists s ety = explExists (cast s :: Space Shape) ety
@@ -168,9 +168,9 @@
   explMembers s = explMembers (cast s :: Space Shape)
 
 instance ExplSet IO (Space Elasticity) where
-  explSet (Space _ sMap _ _ _) ety (Elasticity vec) = do
+  explSet (Space _ sMap _ _ _) ety (Elasticity elasticity) = do
     rd <- M.lookup ety <$> readIORef sMap
-    forM_ rd$ \(Record s _) -> setElasticity s vec
+    forM_ rd$ \(Record s _) -> setElasticity s elasticity
 
 instance ExplGet IO (Space Elasticity) where
   explExists s ety = explExists (cast s :: Space Shape) ety
@@ -196,9 +196,9 @@
   explMembers s = explMembers (cast s :: Space Shape)
 
 instance ExplSet IO (Space Mass) where
-  explSet (Space _ sMap _ _ _) ety (Mass vec) = do
+  explSet (Space _ sMap _ _ _) ety (Mass mass) = do
     rd <- M.lookup ety <$> readIORef sMap
-    forM_ rd$ \(Record s _) -> setMass s vec
+    forM_ rd$ \(Record s _) -> setMass s mass
 
 instance ExplGet IO (Space Mass) where
   explExists s ety = explExists (cast s :: Space Shape) ety
@@ -224,9 +224,9 @@
   explMembers s = explMembers (cast s :: Space Shape)
 
 instance ExplSet IO (Space Density) where
-  explSet (Space _ sMap _ _ _) ety (Density vec) = do
+  explSet (Space _ sMap _ _ _) ety (Density density) = do
     rd <- M.lookup ety <$> readIORef sMap
-    forM_ rd$ \(Record s _) -> setDensity s vec
+    forM_ rd$ \(Record s _) -> setDensity s density
 
 instance ExplGet IO (Space Density) where
   explExists s ety = explExists (cast s :: Space Shape) ety
@@ -252,9 +252,9 @@
   explMembers s = explMembers (cast s :: Space Shape)
 
 instance ExplSet IO (Space Friction) where
-  explSet (Space _ sMap _ _ _) ety (Friction vec) = do
+  explSet (Space _ sMap _ _ _) ety (Friction friction) = do
     rd <- M.lookup ety <$> readIORef sMap
-    forM_ rd$ \(Record s _) -> setFriction s vec
+    forM_ rd$ \(Record s _) -> setFriction s friction
 
 instance ExplGet IO (Space Friction) where
   explExists s ety = explExists (cast s :: Space Shape) ety
@@ -284,9 +284,9 @@
   explMembers s = explMembers (cast s :: Space Shape)
 
 instance ExplSet IO (Space SurfaceVelocity) where
-  explSet (Space _ sMap _ _ _) ety (SurfaceVelocity vec) = do
+  explSet (Space _ sMap _ _ _) ety (SurfaceVelocity svel) = do
     rd <- M.lookup ety <$> readIORef sMap
-    forM_ rd$ \(Record s _) -> setSurfaceVelocity s vec
+    forM_ rd$ \(Record s _) -> setSurfaceVelocity s svel
 
 instance ExplGet IO (Space SurfaceVelocity) where
   explExists s ety = explExists (cast s :: Space Shape) ety
@@ -348,9 +348,9 @@
   explMembers s = explMembers (cast s :: Space Shape)
 
 instance ExplSet IO (Space CollisionType) where
-  explSet (Space _ sMap _ _ _) ety (CollisionType vec) = do
+  explSet (Space _ sMap _ _ _) ety (CollisionType ctype) = do
     rd <- M.lookup ety <$> readIORef sMap
-    forM_ rd$ \(Record s _) -> setCollisionType s vec
+    forM_ rd$ \(Record s _) -> setCollisionType s ctype
 
 instance ExplGet IO (Space CollisionType) where
   explExists s ety = explExists (cast s :: Space Shape) ety
diff --git a/src/Apecs/Physics/Types.hs b/src/Apecs/Physics/Types.hs
--- a/src/Apecs/Physics/Types.hs
+++ b/src/Apecs/Physics/Types.hs
@@ -133,10 +133,16 @@
 -- See <https://en.wikipedia.org/wiki/Friction> for more information.
 newtype Friction        = Friction        Double     deriving (Eq, Show)
 newtype SurfaceVelocity = SurfaceVelocity Vec        deriving (Eq, Show)
-newtype CollisionType   = CollisionType   C.CUIntPtr deriving (Eq, Show)
 
 type CollisionGroup = CUInt
 
+-- | Collision Filters determine what shapes this shape collides with.
+--   Shapes in the same 'filterGroup' will never collide with one another.
+--   This is used to ignore collisions between parts on a complex object.
+--
+--   'filterCategories' is a bitmask that determines what categories a shape belongs to.
+--   'filterMask' is a bitmask that determines what categories it collides with.
+--   See <https://chipmunk-physics.net/release/ChipmunkLatest-Docs/#cpShape-Filtering> for more information.
 data CollisionFilter = CollisionFilter
   { filterGroup      :: CollisionGroup
   , filterCategories :: Bitmask
@@ -203,6 +209,7 @@
 newtype MaxBias       = MaxBias       Double deriving (Eq, Show)
 newtype ErrorBias     = ErrorBias     Double deriving (Eq, Show)
 newtype CollideBodies = CollideBodies Bool   deriving (Eq, Show)
+newtype Impulse       = Impulse       Double deriving (Eq, Show)
 
 data Constraint = Constraint Entity Entity ConstraintType deriving (Eq, Show)
 
@@ -221,7 +228,6 @@
   deriving (Eq, Show)
 
 -- TODO
--- getConstraintImpulse
 -- getPinJointDistance
 -- getSlideJointDistance?
 
@@ -256,9 +262,20 @@
   -- in this callback, if you need that for processing.
   }
 
+-- | A 'Shape' can have a 'CollisionType'.
+--   'CollisionType's are used by callbacks for filtering, also see 'CollisionSource'.
+--   The difference between 'CollisionType' and 'CollisionFilter' is that a 'CollisionFilter' determines whether
+--   two shapes in the physics engine collide, or pass through one another, whereas a 'CollisionType' determines
+--   what callback is called.
+--   In general, if you don't want any special checks to happen, use 'CollisionFilter'.
+newtype CollisionType = CollisionType C.CUIntPtr
+  deriving (Num, Eq, Show)
+
+-- | A 'CollisionSource' determines what types of collisions a callback handles.
+--   Also see 'CollisionType'
 data CollisionSource
-  = Wildcard CollisionGroup
-  | Between CollisionGroup CollisionGroup
+  = Wildcard CollisionType
+  | Between CollisionType CollisionType
 
 -- Corresponds to an 'arbiter' in Chipmunk
 data Collision = Collision
