I just reviewed a paper that equated Neo-functionaliztion, exaptation, and co-option - using the terms interchangeably. My first instinct was that this was a problem, but it took me a while to work through my thoughts on it; including influential twitter discussion with Vincent Lynch. I thought I would put my thoughts here, in case they are useful or objectionable to anyone.
In my understanding of the terms, “Neo-functionalization” implies that a *duplicated* structure (usually a gene, but not always) gains a new function. As Vinny puts it:
"b/c neofunc is a process in which a homologous character maintains ancestral function"
“Exaptation” implies no such duplication. A classic example is feathers - their original function was probably insulation, and their exapted function is flight. Here, there is no substantive change in the exapted structure (or at least that is not the point) - instead, exaptation is a change in function at one level of biological organization. The point is that selection can fix a structure with one function that is later exapted for another function.
Co-option is a bit similar to both neo-functionalization and exaptation; but I think there are subtle differences. Co-option has become a dominant term in gene expression, and I think even in other contexts (unlike co-option and neo-functionalization) usually examines two levels of structural organization at once. For example, co-option of a gene is inferred when we discover expression in a new place (or perhaps time). Co-option is a copying of expression, but not a duplication of the gene’s structure. Expression is an element of function, but not really the same as the organismal functions usually in play in exaptation. I think people use co-option similarly in morphology where a structure is moved to a new place to become part of another structure that was already there.
Unfortunately, co-option is a very vague and diffuse term in general, and I think is used in ways more extensively than I suggested in the previous paragraph.
For one thing, co-option is sometimes used to describe a duplicated element (see Ganfornina et al 1999 for some examples). For another thing, co-option refers to both pattern and process (mentioned in Oakley, 2007). It is used both to describe a pattern where a gene seems to be expressed in unrelated places, and to describe the mechanism that causes such gene expression. It's like the early days of "species", where species meant both the elements and the process.
Ganfornina M.D., Sánchez D. 1999. Generation of evolutionary novelty by functional shift. Bioessays. 21:432–439.
Oakley T.H. 2007. A review of Gene Sharing and Evolution: The Diversity of Protein Functions, by Joram Piatigorsky. Evol. Dev. 9:514–516.