In version 10 there is a new function PositionIndex 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 PositionIndex[test] // Timing // First 0.015600 2.418016
Perhaps in future release this function will live up to its potential.