I managed to make it work by altering the hasUl function to return all <li> tags, not just those with <ul> children, which makes a mockery of the function name, but solves the issue that the over() function never runs for <li>'s without children, and thus doesn't hide its sibling's children.
hasUl = function(){ return $.superfish.op.oldJquery ? 'li' : 'li'; };