How to cross-reference items in description lists?

I don't know of a pre-built package that allows you to do this, but if I correctly understand what you're after then it is achievable by combining a counter with custom commands and the hyperref package. The first step is to create a new counter for the described items, and a pair of new commands to use in place of \item and \ref. In the preamble, put the following:

\newcounter{desccount}
\newcommand{\descitem}[1]{%
  \item[#1] \refstepcounter{desccount}\label{#1}
}
\newcommand{\descref}[1]{\hyperref[#1]{#1}}

The new command \descitem is to be used in place of \item within a description environment. It takes a single argument and creates an item labeled with it. It also increments the new counter, sets it as the current value for the \ref command, and labels the location with the item's descriptor. The new command \descref takes the same argument and makes a hyperlink reference to the label, displaying the argument instead of the counter's value.

The commands work together like this:

\begin{description}
  \descitem{foo} foo is good
  \descitem{bar} bar is bad
\end{description}
...
For good things (see, for example \descref{foo})... 

Okay, after Michael's second answer I had an idea which I want to just document here. Instead of using the description environment, it seems that another way is to abuse the list environment. The following snipplet is what can be done

\newcounter{foobarcounter}
\renewcommand{\thefoobarcounter}
      {({\ifcase\value{foobarcounter}\or foo\or bar\else ehhh\fi\relax})}
\begin{list}{\thefoobarcounter}{\usecounter{foobarcounter}}
 \item\label{foodesc} Foo is good
 \item Bar is bad
 \item This list was not supposed to be this long
\end{list}
......
.. Something good, see \ref{foodesc}.

Comments are welcome.


A quick and dirty approach could be patching the underlying \@item-command to also place a \phantomsection, i.e., an anchor for hyperlinks, and to redefine \@currentlabel to expand to the content of the optional argument.

With this approach please don't use the \label-command inside the optional argument of \item within the mydescription-environment...

\documentclass{article}
\usepackage{hyperref}
\begin{document}
\makeatletter
\newcommand\my@saved@item{}
\newcommand\mydescriptionitem{}
\def\mydescriptionitem[#1]{%
  \my@saved@item[{\csname phantomsection\endcsname#1}]%
  \def\@currentlabel{\unexpanded{\unexpanded{#1}}}%
}%
\newenvironment{mydescription}%
               {%
                  \let\my@saved@item=\@item
                  \let\@item=\mydescriptionitem
                  \description
               }%
               {\csname enddescription\endcsname}
\makeatother

\begin{mydescription}
\item[foo]  \label{foo} foo is good
\item[bar]  \label{bar} bar is bad
\end{mydescription}

For good things (see, for example \ref{foo})\dots

For bad things (see, for example \ref{bar})\dots

\end{document}

enter image description here