There's a good chance the kernel is already using T, the fifth part of the VLIW bundle.
Use Stream Kernel Analyzer to find out.
If the kernel is memory-bound then the key is to make the minimum number of trips to memory and fetch in the biggest possible lumps. So float4 fetches from memory are better than float fetches.
With local memory reads and writes float2s or larger are preferable.
When you are ALU bound then manual loop-unrolling is the way to go, if you have any loops to unroll. There's a huge variety of approaches to loop-unrolling.
If you have no loops to unroll then it's possible to create them by making one work item process multiple elements from the domain of execution. Even a simple loop over four such elements processed by a single work item could be enough.
All of these vectorisation techniques run the risk of being unfriendly for other architectures, e.g. NVidia prefers limited unrolling because of register allocation pressure. ATI will also suffer with too much unrolling, so don't go completely crazy.