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.