diff --git a/zsh-syntax-highlighting.zsh b/zsh-syntax-highlighting.zsh
index c830e92..2528f46 100644
--- a/zsh-syntax-highlighting.zsh
+++ b/zsh-syntax-highlighting.zsh
@@ -136,30 +136,31 @@ highlighters_dir="${ZSH_HIGHLIGHT_HIGHLIGHTERS_DIR:-${0:h}/highlighters}"
 }
 
 # Override ZLE widgets to make them invoke _zsh_highlight.
-for event in ${${(f)"$(zle -la)"}:#(_*|orig-*|.run-help|.which-command|.beep)}; do
-  if [[ "$widgets[$event]" == completion:* ]]; then
-    eval "zle -C orig-$event ${${${widgets[$event]}#*:}/:/ } ; $event() { builtin zle orig-$event && _zsh_highlight } ; zle -N $event"
-  else
-    case $event in
-      accept-and-menu-complete)
-        eval "$event() { builtin zle .$event && _zsh_highlight } ; zle -N $event"
-        ;;
-      .*)
-        clean_event=${event#\.}
-        case ${widgets[$clean_event]-} in
-          (completion|user):*)
-            ;;
-          *)
-            eval "$clean_event() { builtin zle $event && _zsh_highlight } ; zle -N $clean_event"
-            ;;
-        esac
-        ;;
-      *)
-        ;;
-    esac
-  fi
+for cur_widget in ${${(f)"$(builtin zle -la)"}:#(.*|orig-*|run-help|which-command|beep)}; do
+  case $widgets[$cur_widget] in
+
+    # Already rebound event: do nothing.
+    user:$cur_widget);;
+
+    # User defined widget: override and rebind old one with prefix "orig-".
+    user:*) eval "zle -N orig-$cur_widget ${widgets[$cur_widget]#*:}; \
+                  $cur_widget() { builtin zle orig-$cur_widget && _zsh_highlight }; \
+                  zle -N $cur_widget";;
+
+    # Completion widget: override and rebind old one with prefix "orig-".
+    completion:*) eval "zle -C orig-$cur_widget ${${widgets[$cur_widget]#*:}/:/ }; \
+                        $cur_widget() { builtin zle orig-$cur_widget && _zsh_highlight }; \
+                        zle -N $cur_widget";;
+
+    # Builtin widget: override and make it call the builtin ".widget".
+    builtin) eval "$cur_widget() { builtin zle .$cur_widget && _zsh_highlight }; \
+                   zle -N $cur_widget";;
+
+    # Default: unhandled case.
+    *) echo "zsh-syntax-highlighting: unhandled ZLE widget '$cur_widget'" >&2 ;;
+  esac
 done
-unset event clean_event
+unset cur_widget
 
 # Start highlighting immediately after the creation of a new command line.
 autoload add-zsh-hook && add-zsh-hook precmd _zsh_highlight