diff --git a/src/Quasar/Wayland/Protocol/TH.hs b/src/Quasar/Wayland/Protocol/TH.hs
index cb94e9605ee4cd4bf81023b6206e8a2bd0ecfef7..7a1e6362c4385f952c8f55336a459e77d24a4db0 100644
--- a/src/Quasar/Wayland/Protocol/TH.hs
+++ b/src/Quasar/Wayland/Protocol/TH.hs
@@ -342,10 +342,13 @@ parseMessage interfaceName (opcode, element) = do
   name <- getAttr "name" element
   since <- read <<$>> peekAttr "since" element
   arguments <- mapM parseArgument $ zip [0..] $ findChildren (qname "arg") element
-  forM_ arguments \arg ->
+  forM_ arguments \arg -> do
     when
-      do arg.argType == GenericNewIdArgument && interfaceName /= "wl_registry"
-      do fail $ "Invalid GenericNewIdArgument encountered on " <> interfaceName <> "." <> name <> " (only valid on wl_registry)"
+      do arg.argType == GenericNewIdArgument && (interfaceName /= "wl_registry" || name /= "bind")
+      do fail $ "Invalid 'new_id' argument without 'interface' attribute encountered on " <> interfaceName <> "." <> name <> " (only valid on wl_registry.bind)"
+    when
+      do arg.argType == GenericObjectArgument && (interfaceName /= "wl_display" || name /= "error")
+      do fail $ "Invalid 'object' argument without 'interface' attribute encountered on " <> interfaceName <> "." <> name <> " (only valid on wl_display.error)"
   pure MessageSpec  {
     name,
     since,