There is a feature in Emacs 25.1 that does what I want, by allowing you to set priorities for the archives you specify. So you can say
(setq package-archive-priorities
'(("melpa-stable" . 20)
("marmalade" . 20)
("gnu" . 10)
("melpa" . 0)))
This will then install packages from the highest-priority archive they are available in. So with the above, `melpa` will only be used if a package can't be found in any of the other archives.