The GitAPI was meant as a high-level API. It is for developers willing to sacrifice performance in order to get an API which offers exactly the same methods as native-git commandline commands. Who don't want this penalty should use our tradiditional API (Repository, ..:Walk, DirCacheCheckout,....).

For such an API I find it ok that if I explicitly create a tag that I get back something tag specific. There are quite some use-cases where I have handle tags differently from other refs. Tags can point to other tags or even to other object types while e.g. branches always point to commits. If I want to know the commit a tag is pointing too (I very common use case I guess) I do that in a tag specific way. Reasons enough for me to introduce a type representing all our tags in our high-level API. Especially when I look at ListTagCommand.