There are several package repositories available.
GNU ELPA is the official package repo.
It's small, and requires copyright assignment (of all authors of a package) to the FSF to contribute to it.
Packages on GNU ELPA are really just a git repo. The advantage of being hosted here is that the core team try to update packages if Emacs itself adds or deprecates features.
Built from source
MELPA is the biggest and fastest growing package repo. It releases a new version every time a new version is pushed to a repo, or an EmacsWiki page is updated.
It's bleeding edge, but it works very well in practice. MELPA is curated to avoid duplicate packages, and to ensure that the canonical home of package is recorded (instead of a random fork).
MELPA does have the problem that versions are just timestamps, e.g.
my-package-20131231.2359. This means if you depend on my-package:
;; Package-Requires: ((my-package "1.2.3"))
then Emacs will think that any version on MELPA is new enough.
MELPA Stable is the same as MELPA, but rather than using datestamp versions, it uses the versions in git tags. This allows for better dependency resolution, but has issues with depending on wiki packages.
Marmalade is much more like a traditional repository from other programming languages. The package developer uploads the package to Marmalade when they do a release.
In principle, this gives packages a proper release process (Marmalade predates MELPA stable) and also avoid the autogenerated version number problem. However, there's no identity verification. Anyone can upload a package, even if they didn't write it. This gets difficult if the maintainer of
my-package finds that someone else uploaded
my-package and can't subsequently upload new versions.
Marmalade used to be a node.js app, and it's now written in elisp. Both versions have had uptime problems occasionally.
Org-mode ELPA is a repo that only hosts
org-plus-contrib. Org-mode is part of Emacs core, but it's developed externally and the code is only synced with Emacs trunk periodically. This repo lets you have the bleeding-edge org-mode.
User42 ELPA is a repo for a single package developer who has released quite a range of Emacs packages. If you like any of his packages, you could add this repo.
Sunrise Commander ELPA is a repo for extensions for Sunrise Commander (an Emacs package for file browsing, inspired by midnight commander).
Tromey's ELPA was the first repo set up. It is officially replaced with GNU ELPA, but it didn't have the same copyright assignment requirements. As of 2010, it is no longer updated.
Elpy package archive contained various packages developed by Jorgen Schaefer for 'Elpy, the Emacs Python Development Environment', but that has migrated to MELPA Stable.