In version 10 there is a new function [`PositionIndex`](http://reference.wolfram.com/mathematica/ref/PositionIndex.html) that could be the go-to method for this operation:

 a = {3, 3, 6, 11, 13, 13, 11, 1, 2, 3, 12, 8, 9, 9, 4, 15, 5, 6, 9, 12};

 Values @ PositionIndex @ a

> {{1, 2, 10}, {3, 18}, {4, 7}, {5, 6}, {8}, {9}, {11, 20},
 {12}, {13, 14, 19}, {15}, {16}, {17}}

Sadly, as currently implemented its performance is very poor, so it is *NOT* the go-to method:

 positionDuplicates[list_] := GatherBy[Range @ Length @ list, list[[#]] &]

 test = RandomInteger[999, 5*^5];

 positionDuplicates[test] // Timing // First

 Values @ PositionIndex[test] // Timing // First

> 0.015600
> 
> 2.215214

Perhaps in future release this function will live up to its potential.