(Note, I edited this to clear it after a few rewinds - look at the change history for most of what I tried.)
Scales are really intended for displaying data of one type. One approach is to use both col and fill to get at least 2 legends. Then you can add linetype and hack it a bit using override.aes . It should be noted that I think that this (in the general case) will lead you to more problems than it solves. If you desperately need to do this, you can (example below). However, if I can convince you: I beg you not to use this approach, if at all possible. Mapping to different things (e.g. shape and linetype ) is likely to result in less clutter. I will give an example of this below.
In addition, when setting the color or fill manually, it is always recommended to use named vectors for palette which ensure that the colors match what you want. If not, then matches occur in order of factor levels.
ggplot(mtcars, aes(x = disp , y = mpg)) + ##region for high mpg geom_rect(aes(linetype = "High MPG") , xmin = min(mtcars$disp)-5 , ymax = max(mtcars$mpg) + 2 , fill = "cyan" , xmax = mean(range(mtcars$disp)) , ymin = 25 , alpha = 0.02 , col = "black") + ## test diff region geom_rect(aes(linetype = "Other Region") , xmin = 300 , xmax = 400 , ymax = 30 , ymin = 25 , fill = "yellow" , alpha = 0.02 , col = "black") + geom_point(aes(fill = factor(vs)),shape = 23, size = 8, alpha = 0.4) + geom_point (aes(col = factor(cyl)),shape = 19, size = 2) + scale_color_manual(values = c("4" = "red" , "6" = "orange" , "8" = "green") , name = "Cylinders") + scale_fill_manual(values = c("0" = "blue" , "1" = "black" , "cyan" = "cyan") , name = "V/S" , labels = c("0?", "1?", "High MPG")) + scale_linetype_manual(values = c("High MPG" = 0 , "Other Region" = 0) , name = "Region" , guide = guide_legend(override.aes = list(fill = c("cyan", "yellow") , alpha = .4)))

Here is a plot that I think will work better in almost all use cases:
ggplot(mtcars, aes(x = disp , y = mpg)) + ##region for high mpg geom_rect(aes(linetype = "High MPG") , xmin = min(mtcars$disp)-5 , ymax = max(mtcars$mpg) + 2 , fill = NA , xmax = mean(range(mtcars$disp)) , ymin = 25 , col = "black") + ## test diff region geom_rect(aes(linetype = "Other Region") , xmin = 300 , xmax = 400 , ymax = 30 , ymin = 25 , fill = NA , col = "black") + geom_point(aes(col = factor(cyl) , shape = factor(vs)) , size = 3) + scale_color_brewer(name = "Cylinders" , palette = "Set1") + scale_shape(name = "V/S") + scale_linetype_manual(values = c("High MPG" = "dotted" , "Other Region" = "dashed") , name = "Region")

For some reason, you insist on using fill . Here's an approach that builds exactly the same plot as the first in this answer, but uses fill as the aesthetics for each of the layers. If this is not what you are insisting on, then I still do not know what you are looking for.
ggplot(mtcars, aes(x = disp , y = mpg)) + ##region for high mpg geom_rect(aes(linetype = "High MPG") , xmin = min(mtcars$disp)-5 , ymax = max(mtcars$mpg) + 2 , fill = "cyan" , xmax = mean(range(mtcars$disp)) , ymin = 25 , alpha = 0.02 , col = "black") + ## test diff region geom_rect(aes(linetype = "Other Region") , xmin = 300 , xmax = 400 , ymax = 30 , ymin = 25 , fill = "yellow" , alpha = 0.02 , col = "black") + geom_point(aes(fill = factor(vs)),shape = 23, size = 8, alpha = 0.4) + geom_point (aes(col = "4") , data = mtcars[mtcars$cyl == 4, ] , shape = 21 , size = 2 , fill = "red") + geom_point (aes(col = "6") , data = mtcars[mtcars$cyl == 6, ] , shape = 21 , size = 2 , fill = "orange") + geom_point (aes(col = "8") , data = mtcars[mtcars$cyl == 8, ] , shape = 21 , size = 2 , fill = "green") + scale_color_manual(values = c("4" = NA , "6" = NA , "8" = NA) , name = "Cylinders" , guide = guide_legend(override.aes = list(fill = c("red","orange","green")))) + scale_fill_manual(values = c("0" = "blue" , "1" = "black" , "cyan" = "cyan") , name = "V/S" , labels = c("0?", "1?", "High MPG")) + scale_linetype_manual(values = c("High MPG" = 0 , "Other Region" = 0) , name = "Region" , guide = guide_legend(override.aes = list(fill = c("cyan", "yellow") , alpha = .4)))
Because I apparently can not leave it alone - here is another approach that uses only fill for aesthetics, and then make separate legends for separate layers and pricking it all together, using cowplot freely after this lesson .
library(cowplot) library(dplyr) theme_set(theme_minimal()) allScales <- c("4" = "red" , "6" = "orange" , "8" = "green" , "0" = "blue" , "1" = "black" , "High MPG" = "cyan" , "Other Region" = "yellow") mainPlot <- ggplot(mtcars, aes(x = disp , y = mpg)) + ##region for high mpg geom_rect(aes(fill = "High MPG") , xmin = min(mtcars$disp)-5 , ymax = max(mtcars$mpg) + 2 , xmax = mean(range(mtcars$disp)) , ymin = 25 , alpha = 0.02) + ## test diff region geom_rect(aes(fill = "Other Region") , xmin = 300 , xmax = 400 , ymax = 30 , ymin = 25 , alpha = 0.02) + geom_point(aes(fill = factor(vs)),shape = 23, size = 8, alpha = 0.4) + geom_point (aes(fill = factor(cyl)),shape = 21, size = 2) + scale_fill_manual(values = allScales) vsLeg <- (ggplot(mtcars, aes(x = disp , y = mpg)) + geom_point(aes(fill = factor(vs)),shape = 23, size = 8, alpha = 0.4) + scale_fill_manual(values = allScales , name = "VS") ) %>% ggplotGrob %>% {.$grobs[[which(sapply(.$grobs, function(x) {x$name}) == "guide-box")]]} cylLeg <- (ggplot(mtcars, aes(x = disp , y = mpg)) + geom_point (aes(fill = factor(cyl)),shape = 21, size = 2) + scale_fill_manual(values = allScales , name = "Cylinders") ) %>% ggplotGrob %>% {.$grobs[[which(sapply(.$grobs, function(x) {x$name}) == "guide-box")]]} regionLeg <- (ggplot(mtcars, aes(x = disp , y = mpg)) + geom_rect(aes(fill = "High MPG") , xmin = min(mtcars$disp)-5 , ymax = max(mtcars$mpg) + 2 , xmax = mean(range(mtcars$disp)) , ymin = 25 , alpha = 0.02) + ## test diff region geom_rect(aes(fill = "Other Region") , xmin = 300 , xmax = 400 , ymax = 30 , ymin = 25 , alpha = 0.02) + scale_fill_manual(values = allScales , name = "Region" , guide = guide_legend(override.aes = list(alpha = 0.4))) ) %>% ggplotGrob %>% {.$grobs[[which(sapply(.$grobs, function(x) {x$name}) == "guide-box")]]} legendColumn <- plot_grid( # To make space at the top vsLeg + theme(legend.position = "none") # Plot the legends , vsLeg, regionLeg, cylLeg # To make space at the bottom , vsLeg + theme(legend.position = "none") , ncol = 1 , align = "v") plot_grid(mainPlot + theme(legend.position = "none") , legendColumn , rel_widths = c(1,.25))

As you can see, the result is almost identical to the first method, which I demonstrated how to do it, but now does not use any other aesthetics. I still do not understand why you think this difference is important, but at least now there is another way to skin the cat. I can use this approach for generality (for example, when several graphs have a common aesthetics of color / symbol / line type, and you want to use one legend), but I do not see the point in using it here.