Oracle has a great article on this task and makes recommendations as to what should be pinned.

You can also run this script to get an idea of what is going on in your SP.
Code:
SELECT owner, name, o.type, sharable_mem,
       loads, executions, kept
  FROM v$db_object_cache o
 WHERE loads > 0  AND o.type in ('PACKAGE', 'FUNCTION', 'PROCEDURE', 'TRIGGER', 'SEQUENCE')
 ORDER BY sharable_mem DESC
Of course you can modify it to check the number of executions and such.

Just to give you an example of why pinning objects are a good thing. Lets look at this.

Code:
SUBSTR( SUBSTR( TYPE                              LOADS EXECUTIONS KEP
------- ------- ---------------------------- ---------- ---------- ---
SYS     DBMS_PI PACKAGE                            1932     678695 NO
SYS     DBMS_LO PACKAGE                             581     576015 NO
SDE     PINFO_U PACKAGE                              50    1092836 NO
MPI2    TA_SIP_ TRIGGER                              35     366824 NO
MPI2    SPCOL_D TRIGGER                              35     154010 NO
MPI2    TIB_DML TRIGGER                              18    4017861 NO
MPI2    TXP_DEV TRIGGER                               9     105112 NO
MPI2    TTL_DEV TRIGGER                               6     106664 NO
MPI2    TA_SIP_ TRIGGER                               6     106665 NO
MPI2    TSDE_DE TRIGGER                               6     105117 NO
SDE     LOCK_UT PACKAGE                               5    3057220 YES

SUBSTR( SUBSTR( TYPE                              LOADS EXECUTIONS KEP
------- ------- ---------------------------- ---------- ---------- ---
SYS     DBMS_UT PACKAGE                               4     221480 YES
SDE     SDE_UTI PACKAGE                               4    4500938 YES
If you notce the dbms_pipe is not kept and look how many times Oracle had to load him into memory.
This was taken 30 minutes after the above as executed and dbms_pipe was pinned. Notice how the loads have stopped?
Code:
SUBSTR( SUBSTR( TYPE                              LOADS EXECUTIONS KEP
------- ------- ---------------------------- ---------- ---------- ---
SYS     DBMS_PI PACKAGE                            1935     680144 YES
One other thing you can look at if you're having problems with your shared pool is the SQL that's being put in there. As of Oracle9i there's a new parameter for cursor_sharing that's called similar. This is great to use if your app has a problem with not using bind variables.

You can also implement your db_keep_cache_size parameter this is used for when you want to cache your tables.

I hope this helps and good luck.