If I create a plot with ggplot2 and use separate, say, shape and fill scales to delineate data, I would expect the legend would delineate between \"w
You have to override the shape that's being used in the legend, as seen in this question.
So using your example code (thanks for the clear, reproducible question, by the way), all you need to do is:
p + guides(fill = guide_legend(override.aes = list(shape = 21)))
Which gives you what you wanted: