diff --git a/ghcjs-dom.cabal b/ghcjs-dom.cabal
--- a/ghcjs-dom.cabal
+++ b/ghcjs-dom.cabal
@@ -1,5 +1,5 @@
 name: ghcjs-dom
-version: 0.2.3.1
+version: 0.2.4.0
 cabal-version: >=1.10
 build-type: Simple
 license: MIT
@@ -40,7 +40,7 @@
 
 library
     build-depends: base <5,
-                   transformers >=0.2 && <0.5,
+                   transformers >=0.2 && <0.6,
                    text >= 0.11.0.6 && < 1.3
 
     default-language: Haskell2010
@@ -1097,7 +1097,7 @@
     if !impl(ghcjs) || flag(webkit)
         cpp-options: -DUSE_WEBKIT
         build-depends: glib >=0.13.0.0 && <0.14,
-                       transformers >=0.3.0.0 && <0.5
+                       transformers >=0.3.0.0 && <0.6
         if flag(gtk3)
             build-depends: gtk3 >=0.13.0.0 && <0.15, webkitgtk3 >=0.14.0.0 && <0.15
         else
diff --git a/src/GHCJS/DOM/EventM.hs b/src/GHCJS/DOM/EventM.hs
--- a/src/GHCJS/DOM/EventM.hs
+++ b/src/GHCJS/DOM/EventM.hs
@@ -74,6 +74,7 @@
 import           GHCJS.DOM.EventTarget
 import           GHCJS.DOM.EventTargetClosures
 import           Data.Word (Word)
+import           Data.Foldable (forM_)
 
 type EventM t e = ReaderT e IO
 
@@ -102,6 +103,16 @@
     l <- newListener callback
     addListener target eventName l False
     return (removeListener target eventName l False >> releaseListener l)
+
+onThese :: (IsEventTarget t, IsEvent e) => [(t, EventName t e)] -> EventM t e () -> IO (IO ())
+onThese targetsAndEventNames callback = do
+    l <- newListener callback
+    forM_ targetsAndEventNames $ \(target, eventName) ->
+        addListener target eventName l False
+    return (do
+        forM_ targetsAndEventNames (\(target, eventName) ->
+            removeListener target eventName l False)
+        releaseListener l)
 
 event :: EventM t e e
 event = ask
diff --git a/src/GHCJS/DOM/JSFFI/RTCPeerConnection.hs b/src/GHCJS/DOM/JSFFI/RTCPeerConnection.hs
--- a/src/GHCJS/DOM/JSFFI/RTCPeerConnection.hs
+++ b/src/GHCJS/DOM/JSFFI/RTCPeerConnection.hs
@@ -96,12 +96,12 @@
     RTCPeerConnection -> Nullable MediaStreamTrack -> State# RealWorld -> (# State# RealWorld, Bool, ByteArray# #)
 
 -- | <https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection#getStats Mozilla webkitRTCPeerConnection.getStats documentation>
-getStats' :: (MonadIO m, IsMediaStreamTrack selector) => RTCPeerConnection -> Maybe selector -> m (Either DOMError RTCStatsReport)
+getStats' :: (MonadIO m, IsMediaStreamTrack selector) => RTCPeerConnection -> Maybe selector -> m (Either DOMError RTCStatsResponse)
 getStats' self selector = liftIO . IO $ \s# ->
     case js_getStats self (maybeToNullable $ fmap toMediaStreamTrack selector) s# of
-        (# s2#, False, error #) -> (# s2#, Left  (DOMError       (JSVal error)) #)
-        (# s2#, True,  stats #) -> (# s2#, Right (RTCStatsReport (JSVal stats)) #)
+        (# s2#, False, error #) -> (# s2#, Left  (DOMError         (JSVal error)) #)
+        (# s2#, True,  stats #) -> (# s2#, Right (RTCStatsResponse (JSVal stats)) #)
 
-getStats :: (MonadIO m, IsMediaStreamTrack selector) => RTCPeerConnection -> Maybe selector -> m RTCStatsReport
+getStats :: (MonadIO m, IsMediaStreamTrack selector) => RTCPeerConnection -> Maybe selector -> m RTCStatsResponse
 getStats self selector = getStats' self selector >>= either throwDOMErrorException return
 
