                            (list :type 'add-signature
                                  :signature (mapconcat #'identity (split-string (substring text start)) " ")
                                  :line (flycheck-error-line msg)))))
+          ;; Messages of this format:
+          ;;
+          ;;     Redundant constraints: (Arith var, Bitwise var)
+          ;; Or
+          ;;     Redundant constraint: Arith var
+          ;; Or
+          ;;     Redundant constraints: (Arith var,
+          ;;                             Bitwise var,
+          ;;                             Functor var,
+          ;;                             Applicative var,
+          ;;                             Monad var)
+          (when (string-match "Redundant constraints?:[\n[:space:]]*\\(\\([[:alnum:][:space:]]+\\)\\|(\\([[:alnum:][:space:],\n]+\\))\\).*\n.*In the " text)
+            (setq note t)
+            (add-to-list
+             'intero-suggestions
+             (let ((rest (substring text (match-end 0)))
+                   (redundant (or (match-string 2 text) (match-string 3 text))))
+               (list :type 'redundant-constraint
+                     :redundancies (mapcar #'string-trim
+                                           (split-string redundant
+                                                         "[:space:]*,[:space:]*"))
+                     :signature (mapconcat #'identity (split-string rest) " ")
+                     :line (flycheck-error-line msg)))))
           ;; Add a note if we found a suggestion to make
           (when note
             (setf (flycheck-error-message msg)

                 (list :key suggestion
                       :title (concat "Add signature: "
                                      (plist-get suggestion :signature))
                       :default t))))
            intero-suggestions)))))
    (if (null to-apply)
        (message "No changes selected to apply.")

                 (insert (plist-get suggestion :replacement))))))
        ;; # Changes that do increase/decrease line numbers
        ;;
        ;; Remove redundant constraints
        (cl-loop
         for suggestion in sorted
         do (cl-case (plist-get suggestion :type)
              (redundant-constraint
               (save-excursion
                 (goto-char (point-min))
                 (forward-line (1- (plist-get suggestion :line)))
                 (if (search-forward-regexp "\\([[:space:]]*::\\|instance\\)[[:space:]]* (?\\([[:alnum:][:space:],?\n]+\\))?[[:space:]?\n]*=>" (point-max) t)
                     (let* ((start (match-beginning 2))
                            (end (match-end 2))
                            (constraints
                             (mapcar #'string-trim
                                     (split-string (match-string 2)
                                                   "[[:space:]]*,[[:space:]]*")))
                            (nonredundant
                             (loop for r in (plist-get suggestion :redundancies)
                                   with nonredundant = constraints
                                   do (setq nonredundant (delete r nonredundant))
                                   finally return nonredundant)))
                       (goto-char start)
                       (delete-char (- end start))
                       (insert (string-join nonredundant ", ")))
                   (message "Couldn't parse constraints"))))))


        ;; Add a type signature to a top-level binding.
        (cl-loop
         for suggestion in sorted
