diff --git a/System/Win32/Automation/Input/Mouse.hsc b/System/Win32/Automation/Input/Mouse.hsc
--- a/System/Win32/Automation/Input/Mouse.hsc
+++ b/System/Win32/Automation/Input/Mouse.hsc
@@ -36,7 +36,7 @@
     alignment _ = #alignment MOUSEINPUT
     poke buf input = do
         (#poke MOUSEINPUT, dx) buf (dx input)
-        (#poke MOUSEINPUT, dx) buf (dx input)
+        (#poke MOUSEINPUT, dy) buf (dy input)
         (#poke MOUSEINPUT, mouseData)   buf (mouseData input)
         (#poke MOUSEINPUT, dwFlags)     buf (dwFlags input)
         (#poke MOUSEINPUT, time)        buf (time input)
diff --git a/System/Win32/Process.hsc b/System/Win32/Process.hsc
--- a/System/Win32/Process.hsc
+++ b/System/Win32/Process.hsc
@@ -54,7 +54,6 @@
     , pROCESS_VM_OPERATION          = PROCESS_VM_OPERATION
     , pROCESS_VM_READ               = PROCESS_VM_READ
     , pROCESS_VM_WRITE              = PROCESS_VM_WRITE
-    , sYNCHORNIZE                   = SYNCHRONIZE 
     }
 
 foreign import WINDOWS_CCONV unsafe "windows.h OpenProcess"
@@ -71,7 +70,7 @@
 getProcessId h = failIfZero "GetProcessId" $ c_GetProcessId h
 
 foreign import WINDOWS_CCONV unsafe "windows.h GetCurrentProcess"
-    c_GetCurrentProcess :: IO ProcessHandle 
+    c_GetCurrentProcess :: IO ProcessHandle
 
 foreign import WINDOWS_CCONV unsafe "windows.h GetCurrentProcessId"
     c_GetCurrentProcessId :: IO ProcessId
@@ -105,7 +104,7 @@
     }
 {-
     , tH32CS_SNAPGETALLMODS = TH32CS_GETALLMODS
-    , tH32CS_SNAPNOHEAPS    = TH32CS_SNAPNOHEAPS 
+    , tH32CS_SNAPNOHEAPS    = TH32CS_SNAPNOHEAPS
 -}
 
 foreign import WINDOWS_CCONV unsafe "tlhelp32.h CreateToolhelp32Snapshot"
diff --git a/System/Win32/Registry.hsc b/System/Win32/Registry.hsc
--- a/System/Win32/Registry.hsc
+++ b/System/Win32/Registry.hsc
@@ -39,12 +39,14 @@
         , regOpenKey         -- :: HKEY -> String -> IO HKEY
         , regOpenKeyEx       -- :: HKEY -> String -> REGSAM -> IO HKEY
         , regQueryInfoKey    -- :: HKEY -> IO RegInfoKey
-        , regQueryValue      -- :: HKEY -> String -> IO String
-        , regQueryValueKey   -- :: HKEY -> String -> IO String
+        , regQueryValue      -- :: HKEY -> Maybe String -> IO String
+        , regQueryDefaultValue -- :: HKEY -> String -> IO String
         , regQueryValueEx    -- :: HKEY -> String -> Addr -> Int -> IO RegValueType
         , regReplaceKey      -- :: HKEY -> Maybe String -> String -> String -> IO ()
         , regRestoreKey      -- :: HKEY -> String -> RegRestoreFlags -> IO ()
         , regSaveKey         -- :: HKEY -> String -> Maybe LPSECURITY_ATTRIBUTES -> IO ()
+        , regGetValue        -- :: HKEY -> Maybe String -> Maybe String -> RegTypeRestriction
+                             -- -> Maybe LPDWORD -> Maybe LPVOID -> Maybe LPDWORD -> IO ()
         , regSetValue        -- :: HKEY -> String -> String -> IO ()
         , regSetValueEx      -- :: HKEY -> String -> RegValueType -> LPTSTR -> Int -> IO ()
         , regSetStringValue  -- :: HKEY -> String -> String -> IO ()
@@ -72,12 +74,13 @@
 import System.Win32.Time (FILETIME)
 import System.Win32.Types (DWORD, ErrCode, HKEY, LPCTSTR, PKEY, withTString)
 import System.Win32.Types (HANDLE, LONG, LPBYTE, newForeignHANDLE, peekTString)
-import System.Win32.Types (LPTSTR, TCHAR, failUnlessSuccess)
+import System.Win32.Types (LPTSTR, TCHAR, LPDWORD, LPVOID, failUnlessSuccess)
 import System.Win32.Types (castUINTPtrToPtr, failUnlessSuccessOr, maybePtr)
 
 ##include "windows_cconv.h"
 
 #include <windows.h>
+#include "winreg_compat.h"
 
 #{enum HKEY, (unsafePerformIO . newForeignHANDLE . castUINTPtrToPtr)
  , hKEY_CLASSES_ROOT    = (UINT_PTR)HKEY_CLASSES_ROOT
@@ -382,16 +385,25 @@
 
 -- RegQueryMultipleValues :: HKEY -> IO ([VALENT],String)
 
--- RegQueryValue() isn't really that, it just allows you to
--- get at the default values of keys, so we provide our own
--- (and better!) version of it. If you want RegQueryValue()s
--- behaviour, use regQueryValueKey.
-
-regQueryValueKey :: HKEY -> String -> IO String
+{-# DEPRECATED regQueryValueKey "Use regQueryValue instead." #-}
+regQueryValueKey :: HKEY -> Maybe String -> IO String
 regQueryValueKey key mb_subkey =
   withForeignPtr key $ \ p_key ->
-  withTString mb_subkey $ \ c_subkey ->
+  maybeWith withTString mb_subkey $ \ c_subkey ->
   alloca $ \ p_value_len -> do
+  failUnlessSuccess "RegQueryValueKey" $
+    c_RegQueryValue p_key c_subkey nullPtr p_value_len
+  value_len <- peek p_value_len
+  allocaArray0 (fromIntegral value_len) $ \ c_value -> do
+    failUnlessSuccess "RegQueryValueKey" $
+      c_RegQueryValue p_key c_subkey c_value p_value_len
+    peekTString c_value
+
+regQueryValue :: HKEY -> Maybe String -> IO String
+regQueryValue key mb_subkey =
+  withForeignPtr key $ \ p_key ->
+  maybeWith withTString mb_subkey $ \ c_subkey ->
+  alloca $ \ p_value_len -> do
   failUnlessSuccess "RegQueryValue" $
     c_RegQueryValue p_key c_subkey nullPtr p_value_len
   value_len <- peek p_value_len
@@ -402,19 +414,21 @@
 foreign import WINDOWS_CCONV unsafe "windows.h RegQueryValueW"
   c_RegQueryValue :: PKEY -> LPCTSTR -> LPTSTR -> Ptr LONG -> IO ErrCode
 
-regQueryValue :: HKEY -> String -> IO String
-regQueryValue key mb_subkey =
+-- Gets the data associated with the default value of a key (assumed to be of
+-- type REG_SZ) using RegQeryValueEx.
+regQueryDefaultValue :: HKEY -> String -> IO String
+regQueryDefaultValue key mb_subkey =
   withForeignPtr key $ \ p_key ->
   withTString mb_subkey $ \ c_subkey ->
   alloca $ \ p_ty ->
   alloca $ \ p_value_len -> do
-  failUnlessSuccess "RegQueryValue" $
+  failUnlessSuccess "regQueryDefaultValue" $
     c_RegQueryValueEx p_key c_subkey nullPtr p_ty nullPtr p_value_len
   ty <- peek p_ty
-  failUnlessSuccess "RegQueryValue" $ return (if ty == rEG_SZ then 0 else 1)
+  failUnlessSuccess "regQueryDefaultValue" $ return (if ty == rEG_SZ then 0 else 1)
   value_len <- peek p_value_len
   allocaArray0 (fromIntegral value_len) $ \ c_value -> do
-    failUnlessSuccess "RegQueryValue" $
+    failUnlessSuccess "regQueryDefaultValue" $
       c_RegQueryValueEx p_key c_subkey nullPtr p_ty c_value p_value_len
     peekTString (castPtr c_value)
 
@@ -472,6 +486,35 @@
 -- endif
 
 -- 3.1 compat. - only allows storage of REG_SZ values.
+
+regGetValue :: HKEY -> Maybe String -> Maybe String -> RegTypeRestriction -> Maybe LPDWORD -> Maybe LPVOID -> Maybe LPDWORD -> IO ()
+regGetValue key m_subkey m_valuename flags m_type m_value m_size =
+  withForeignPtr key $ \ p_key ->
+  maybeWith withTString m_subkey $ \ c_subkey ->
+  maybeWith withTString m_valuename $ \ c_valuename ->
+  failUnlessSuccess "RegGetValue" $
+    c_RegGetValue p_key c_subkey c_valuename flags (maybePtr m_type) (maybePtr m_value) (maybePtr m_size)
+foreign import WINDOWS_CCONV unsafe "windows.h RegGetValueW"
+  c_RegGetValue :: PKEY -> LPCTSTR -> LPCTSTR -> DWORD -> LPDWORD -> LPVOID -> LPDWORD -> IO ErrCode
+
+type RegTypeRestriction = DWORD
+
+#{enum RegTypeRestriction,
+  , rRF_RT_ANY            = RRF_RT_ANY
+  , rRF_RT_DWORD          = RRF_RT_DWORD
+  , rRF_RT_QWORD          = RRF_RT_QWORD
+  , rRF_RT_REG_BINARY     = RRF_RT_REG_BINARY
+  , rRF_RT_REG_DWORD      = RRF_RT_REG_DWORD
+  , rRF_RT_REG_EXPAND_SZ  = RRF_RT_REG_EXPAND_SZ
+  , rRF_RT_REG_MULTI_SZ   = RRF_RT_REG_MULTI_SZ
+  , rRF_RT_REG_NONE       = RRF_RT_REG_NONE
+  , rRF_RT_REG_QWORD      = RRF_RT_REG_QWORD
+  , rRF_RT_REG_SZ         = RRF_RT_REG_SZ
+  , rRF_NOEXPAND          = RRF_NOEXPAND
+  , rRF_ZEROONFAILURE     = RRF_ZEROONFAILURE
+  , rRF_SUBKEY_WOW6464KEY = RRF_SUBKEY_WOW6464KEY
+  , rRF_SUBKEY_WOW6432KEY = RRF_SUBKEY_WOW6432KEY
+  }
 
 regSetValue :: HKEY -> String -> String -> IO ()
 regSetValue key subkey value =
diff --git a/Win32.cabal b/Win32.cabal
--- a/Win32.cabal
+++ b/Win32.cabal
@@ -1,5 +1,5 @@
 name:		Win32
-version:	2.7.0.0
+version:	2.8.0.0
 license:	BSD3
 license-file:	LICENSE
 author:		Alastair Reid, shelarcy, Tamar Christina
@@ -13,8 +13,8 @@
 build-type:     Simple
 cabal-version:  >=1.10
 extra-source-files:
-	include/diatemp.h include/dumpBMP.h include/ellipse.h include/errors.h
-	include/Win32Aux.h include/win32debug.h include/alignment.h
+        include/diatemp.h include/dumpBMP.h include/ellipse.h include/errors.h
+        include/Win32Aux.h include/win32debug.h include/alignment.h
         changelog.md
 
 Library
@@ -105,7 +105,7 @@
     ghc-options:      -Wall
     include-dirs:     include
     includes:         "alphablend.h", "diatemp.h", "dumpBMP.h", "ellipse.h", "errors.h", "HsGDI.h", "HsWin32.h", "Win32Aux.h", "win32debug.h", "windows_cconv.h", "WndProc.h", "alignment.h"
-    install-includes: "HsWin32.h", "HsGDI.h", "WndProc.h", "windows_cconv.h", "alphablend.h", "winternl_compat.h", "winuser_compat.h"
+    install-includes: "HsWin32.h", "HsGDI.h", "WndProc.h", "windows_cconv.h", "alphablend.h", "winternl_compat.h", "winuser_compat.h", "winreg_compat.h"
     c-sources:
         cbits/HsGDI.c
         cbits/HsWin32.c
diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,5 +1,17 @@
 # Changelog for [`Win32` package](http://hackage.haskell.org/package/Win32)
 
+## 2.8.0.0 *May 2018*
+
+* Deprecated `regQueryValueKey`. (See #105, #108)
+* Updated `regQueryValue` signature (See #108)
+* Add `regQueryDefaultValue` (See #108)
+* Add `regGetValue` and `RegTypeRestriction` (See #109)
+* Remove `sYNCHRONIZE` from System.Win32.Process, use System.Win32.File instead. (See #110)
+
+## 2.7.1.0 *April 2018*
+
+* Fixed `MOUSEINPUT` storable instance. (See #106)
+
 ## 2.7.0.0 *March 2018*
 
 * Fixed `DWORD_PTR` type (See #99)
diff --git a/include/winreg_compat.h b/include/winreg_compat.h
new file mode 100644
--- /dev/null
+++ b/include/winreg_compat.h
@@ -0,0 +1,32 @@
+#ifndef WINREG_COMPAT_H
+#define WINREG_COMPAT_H
+
+#if defined(x86_64_HOST_ARCH) || __GLASGOW_HASKELL__ > 708
+#
+#else
+#define RRF_RT_REG_NONE 0x00000001
+#define RRF_RT_REG_SZ 0x00000002
+#define RRF_RT_REG_EXPAND_SZ 0x00000004
+#define RRF_RT_REG_BINARY 0x00000008
+#define RRF_RT_REG_DWORD 0x00000010
+#define RRF_RT_REG_MULTI_SZ 0x00000020
+#define RRF_RT_REG_QWORD 0x00000040
+
+#define RRF_RT_DWORD (RRF_RT_REG_BINARY | RRF_RT_REG_DWORD)
+#define RRF_RT_QWORD (RRF_RT_REG_BINARY | RRF_RT_REG_QWORD)
+#define RRF_RT_ANY 0x0000ffff
+
+#define RRF_NOEXPAND 0x10000000
+#define RRF_ZEROONFAILURE 0x20000000
+
+#endif
+
+#ifndef RRF_SUBKEY_WOW6464KEY
+#define RRF_SUBKEY_WOW6464KEY 0x00010000
+#endif
+
+#ifndef RRF_SUBKEY_WOW6432KEY
+#define RRF_SUBKEY_WOW6432KEY 0x00020000
+#endif
+
+#endif /* WINREG_COMPAT_H */
