I've tracked down the bug to mouse--down-1-maybe-follows-link too, but don't think read-event is the culprit here. Rather, mouse--down-1-maybe-follows-link discards the result of mouse-on-link-p, which contains the event a click is supposed to be translated into. Instead, it just replaces the mouse event with mouse-2 if mouse-on-link-p returns non-nil.